好吧所以我对Haskell中的编程比较陌生,在处理从树中预先返回数据的函数时,我遇到了这个错误。
代码:
preorder ::(Show a, Show b) => (a -> c) -> (b -> c) -> Tree a b -> [c]
preorder x y (Leaf n) = x n
preorder x y (Branch b ltree rtree) = (y b) ++ (preorder x y ltree) ++ (preorder x y rtree)
第17行:
preorder x y (Leaf n) = x n
错误讯息:
A3.hs:17:0:
Occurs check: cannot construct the infinite type: c = [c]
When generalising the type(s) for `preorder'
我不知道这对人们来说可能看起来很奇怪,但是这个代码给出的参数是为了让这个函数接受另外两个将树的元素转换为可用类型的函数。第一个函数是接受树的叶子并将其转换,而第二个函数是接受分支并转换它然后构造一个列表。这是解决这个问题的第一次尝试。
答案 0 :(得分:3)
根据行17中preorder
,x :: a -> c
的声明类型,这意味着x n :: c
。但是,preorder
的返回值声明为[c]
。这意味着x n :: [c]
。第17行应该是
preorder x y (Leaf n) = [x n]
也就是说,叶子的返回值必须是单个列表,可以连接到其他值。出于同样的原因,第18行需要阅读
preorder x y (Branch b ltree rtree) = [(y b)] ++ (preorder x y ltree) ++ (preorder x y rtree)
因为y :: b -> c
表示(y b) :: c
运算符需要[c]
,而不是++
。