我遇到下一个代码的问题,我的想法是创建一个函数,该函数返回一个文件中的单词列表,其中包含元组中的目录。
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")]
我不知道问题是什么,有人可以告诉我吗?感谢。
答案 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
something
的{{1}}并将其分配给IO
实际上它适用于任何varname
,而不仅仅是Monad
。
此外,在第一个定义中,您将返回IO
,但这是[]
类型,而[something]
应该是gainData
类型,因此您必须添加{ {1}}层到它:
IO [something]
IO
&#34;相反&#34; gainData [] = return []
的。{它需要return
并将其转换为<-
,可以使用something
提取。