我开始学习Haskell并感到不知所措。我现在正在尝试创建一个函数,该函数从标准输入或文件列表的内容返回一个字符串。 换句话说,我正在尝试复制Unix wc实用程序的行为,该实用程序在没有给出文件时从stdin获取输入。
我创造了这样的东西:
parseArgs [] = [getContents]
parseArgs fs = mapM readFile fs
但是它没有编译,因为在一种情况下我有[IO String]而在另一个IO [String]中。在所有情况下,我无法使此模式匹配以返回IO [String]。请指出正确的方向。
答案 0 :(得分:7)
要使第一个模式也IO [String]
,您必须首先从列表中解压缩值,然后重新打包。像这样:
do c <- getContents
return [c]
在正常的一元符号中:
getContents >>= \c -> return [c]
在这种情况下,通常最好使用仿函数而不是monad。然后,您可以避免使用return
:
fmap (:[]) getContents
(:[])
与\x -> [x]
具有相同的含义,它会创建一个单例列表。