haskell - 如何创建一个 Haskell 函数将 IO String 转换为 IO [String]?

标签 haskell io monads

我已经开始学习 Haskell 并对其感到不知所措。我现在尝试创建一个函数,该函数从标准输入或文件列表的内容返回字符串。 换句话说,我试图复制 Unix wc 实用程序的行为,该实用程序在没有给出文件时从 stdin 获取输入。

我创建了这样的东西:

parseArgs [] = [getContents]
parseArgs fs = mapM readFile fs

但它无法编译,因为在一种情况下我有 [IO String],而在另一种情况下我有 [String]。我无法使此模式匹配在所有情况下都返回 IO [String]。请指出我正确的方向。

最佳答案

要使第一个模式也是 IO [String],您必须先从列表中解压值,然后重新打包。像这样的事情:

do c <- getContents
   return [c]

在正常的一元表示法中:

getContents >>= \c -> return [c]

在这种情况下,通常最好使用仿函数而不是 monad。然后你就可以避免返回:

fmap (:[]) getContents

(:[])\x -> [x] 含义相同,它创建一个单例列表。

关于haskell - 如何创建一个 Haskell 函数将 IO String 转换为 IO [String]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5235824/

相关文章:

list - 在 Haskell 的列表中查找元素的索引?

haskell - 将 -ddump-splices 传递给 Stack 脚本解释器

linux - 如何在 Linux 上显示当前磁盘 IO 队列长度?

scala - 在 Scala 工作表中打印 Futures 的结果

scala - 在 for-comprehension 中使用不同的 monad

list ->> 运算符——Haskell 中的穷人循环?

haskell - Applicative 是否有翻转运算符?

c# - 用 Either/Maybe/Option 替换异常

java - Android 定期写入内存上的文件时如何避免 I/O 问题

Java,如何从大文件中提取一些文本并将其导入到较小的文件中