有人可以解释一下我的功能发生了什么。
arrayReader :: [Int] -> IO [Int]
arrayReader arr = do
item <- readLn
return $ if item == 0
then arr
else arrayReader item:arr
但是Haskell对第六行不满意:
reader.hs:6:17:
Couldn't match expected type `Int' with actual type `IO [Int]'
In the return type of a call of `arrayReader'
In the first argument of `(:)', namely `arrayReader item'
In the expression: arrayReader item : arr
有人可以解释需要进行哪些更改才能使此函数编译吗?
最佳答案
首先,您有一个优先级错误-arrayReader item:arr
解析为(arrayReader item):arr
。您需要编写arrayReader (item:arr)
。
其次,arrayReader
产生某种类型IO [Int]
,但是在这种情况下return
采取某种[Int]
类型并产生IO [Int]
。您需要重新排列代码,以便仅对return
调用arr
,而不对arrayReader
的结果调用。
关于haskell - 无法将预期的 `Int'类型与实际的 `IO [Int]'类型相匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20940019/