太多的辩论在广义的版本倍功能BST
-
28-10-2019 - |
题
运行 倍(+)0样 给我一个错误(+)被应用到太多的参数。为什么?
data(Ord a, Show a, Read a) => BST a = Void | Node {
val :: a,
left, right :: BST a
} deriving (Eq, Ord, Read, Show)
sample = Node 5 (Node 3 Void Void) (Node 10 Void Void)
fold :: (Read a, Show a, Ord a) => (a -> b -> b -> b) -> b -> BST a -> b
fold _ z Void = z
fold f z (Node x l r) = f x (fold f z l) (fold f z r)
Occurs check: cannot construct the infinite type: a = a -> a Probable cause: `+' is applied to too many arguments In the first argument of `fold'', namely `(+)' In the expression: fold' (+) 0 sample
参见: 折
解决方案
你的 fold
需要一个功能的类型 a -> b -> b -> b
作为其第一个参数,这是一个函数,三个参数。 (+)
另一方面,只需要两个参数。
如果 fold
应该改变或者如果你需要叫它有一个不同的功能取决于究竟是什么,你们试图要做。
其他提示
您的问题是将函数应用于3个参数。类型签名中的第一个参数说明了一切。 通用标签
(+)仅接受2个参数,但是当您传入它时,它将尝试对此进行评估: 通用标签
您可能想使用二进制函数(a-> a-> a)折叠。假设您要使用(+)。您希望结果像这样: 通用标签
从那里可以很容易地一概而论:只需用固定的+
替换f
通用标签
不隶属于 StackOverflow