【问题标题】:How to create a Haskell function that turns IO String into IO [String]?如何创建一个将 IO String 转换为 IO [String] 的 Haskell 函数?
【发布时间】:2011-07-11 06:51:50
【问题描述】:

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

我创造了这样的东西:

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

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

【问题讨论】:

    标签: haskell io monads


    【解决方案1】:

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

    do c <- getContents
       return [c]
    

    在正常的一元表示法中:

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

    在这种情况下,通常最好使用 functor 而不是 monad。那你就可以避开return

    fmap (:[]) getContents
    

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

    【讨论】:

    • 或者,因为[] 本身是一个(应用)函子和一个monad,你也可以写fmap return getContents,或者return &lt;$&gt; getContentsControl.Applicative。 (或者您可以将任何returns 替换为pures,再次替换为Control.Applicative。)
    • 我不知道,这是可能的。谢谢你的提示。
    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 2011-05-23
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多