无法构造无限类型 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]
。
好吧,我对 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]
。