【问题标题】:Recursive function with IO带 IO 的递归函数
【发布时间】:2015-05-26 20:02:52
【问题描述】:

我的下一个代码有问题,我的想法是创建一个函数,该函数从一个文件中返回一个单词列表,该文件具有一个元组中的目录。

gainData:: [FilePath] -> IO [([String],String)]
gainData[] = []
gainData(xz:xc) = do
    temp <- readFileP xz
    return ((temp,xz) : gainData xc)

函数 readFileP 得到一个包含文件所有单词的列表。

readFileP:: FilePath -> IO [String]

例如我想得到

[(["word","word1"],"fileAddress"),(["word","word1"],"fileAddress2")]

我不知道是什么问题,有人可以告诉我吗?谢谢。

【问题讨论】:

    标签: haskell recursion


    【解决方案1】:

    你不能这样做:

    return ((temp,xz) : gainData xc)
    

    gainData 函数返回一个IO [something] 而不仅仅是[something]。 您必须先提取返回的值:

    res <- gainData xc
    return $ (temp,xz) : res
    

    varname &lt;- action 执行以下操作:

    • 它调用action,在本例中为gainData xc。此操作返回 IO something
    • 它从IO 中“提取”something 并将其分配给varname

    事实上,它适用于任何Monad,而不仅仅是IO

    此外,在第一个定义中,您将返回 [],但这是 [something] 类型,而 gainData 应该是 IO [something] 类型,因此您必须向其添加 IO 层:

    gainData [] = return []
    

    return&lt;- 的“反面”。它需要 something 并将其转换为 IO something,可以使用 &lt;- 提取。

    【讨论】:

    • 我尝试在程序末尾添加这两行,现在它显示错误Couldn't match expected type IO [([String], String)]' with actual type [a0]' 在表达式中:[] gainData 有什么问题[ ] = [] ?
    • @SeyrenGuile 这是相反的错误。 gainData 必须返回 IO [something] 而不仅仅是 [something] 所以使用 return [] 而不是 []
    • 非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多