IO的递归函数

Asd*_*ren 2 recursion haskell

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

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

函数readFileP获取包含文件所有单词的列表.

readFileP:: FilePath -> IO [String]
Run Code Online (Sandbox Code Playgroud)

例如,我想得到

[(["word","word1"],"fileAddress"),(["word","word1"],"fileAddress2")]
Run Code Online (Sandbox Code Playgroud)

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

Bak*_*riu 8

你做不到:

return ((temp,xz) : gainData xc)
Run Code Online (Sandbox Code Playgroud)

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

res <- gainData xc
return $ (temp,xz) : res
Run Code Online (Sandbox Code Playgroud)

varname <- action执行以下操作:

  • 它叫action,在这种情况下它gainData xc.此操作返回一个IO something
  • something从中"提取" IO并分配给它varname

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

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

gainData [] = return []
Run Code Online (Sandbox Code Playgroud)

return是"相反的" <-.它需要一个something并将其变成一个IO something,可以使用<-.