我已经开始学习 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/