有人可以解释一下我的功能发生了什么。

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/

10-11 19:07