无法构造无限类型 c = [c]

Cannot Construct The infinite type c = [c]

好吧,我对 Haskell 中的编程还比较陌生,在处理从树中预排序 return 数据的函数时,我遇到了这个错误。

代码:

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'

我不知道这对人们来说是否看起来很奇怪,但是为这段代码提供的参数是为了让这个函数接受另外 2 个将树的元素转换为可用类型的函数。第一个功能是取树的叶子并对其进行转换,而第二个功能是取一个分支并对其进行转换,然后构造一个列表。这是想到解决这个问题的第一个尝试。

根据 preorder 的声明类型,第 17 行中的 x :: a -> c。这意味着 x n :: c。但是,preorder 的 return 值被声明为 [c]。这意味着 x n :: [c]。第 17 行应为

preorder x y (Leaf n) = [x n]

也就是说,叶子的 return 值必须是一个可以连接到其他值的单例列表。出于同样的原因,第 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]