IO的递归函数

时间:2015-05-26 11:31:11

标签: haskell recursion

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

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")]

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

1 个答案:

答案 0 :(得分:8)

你做不到:

return ((temp,xz) : gainData xc)

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

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

varname <- action执行以下操作:

  • 它会调用action,在本例中为gainData xc。此操作会返回IO something
  • 它&#34;提取&#34;来自something的{​​{1}}并将其分配给IO

实际上它适用于任何varname,而不仅仅是Monad

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

IO [something]

IO&#34;相反&#34; gainData [] = return [] 的。{它需要return并将其转换为<-,可以使用something提取。