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

Val*_*yev 7 io monads haskell

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

我创造了这样的东西:

parseArgs [] = [getContents]
parseArgs fs = mapM readFile fs
Run Code Online (Sandbox Code Playgroud)

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

fuz*_*fuz 7

要制作第一个模式IO [String],您必须首先从列表中解压缩值,然后重新打包.像这样的东西:

do c <- getContents
   return [c]
Run Code Online (Sandbox Code Playgroud)

在正常的monadic表示法中:

getContents >>= \c -> return [c]
Run Code Online (Sandbox Code Playgroud)

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

fmap (:[]) getContents
Run Code Online (Sandbox Code Playgroud)

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

  • 或者,因为`[]`本身是一个(应用)函子和一个monad,你也可以用`Control.Applicative`编写`fmap return getContents`或`return <$> getContents`.(或者你可以用``control.Applicative`替换任何`return`s和`pure`s'.) (6认同)