运行折叠(+) 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)发生检查:无法构造无限类型:a=a -> a可预测的原因:
+' is applied to too many arguments In the first argument of折叠‘’,即表达式:折叠‘(+) 0示例中的’(+)‘
另见:折叠
发布于 2011-02-04 00:28:04
您的fold需要一个类型为a -> b -> b -> b的函数作为它的第一个参数,即一个带有三个参数的函数。另一方面,(+)只使用两个参数。
如果应该更改fold,或者如果需要使用不同的函数调用它,则取决于您到底要做什么。
发布于 2011-02-04 03:13:05
您的问题是,您将该函数应用于3个参数。类型签名中的第一个参数说明了一切。
fold :: (a -> b -> b -> b) -> b -> BST a -> b
fold f z (Node x l r) = f x (fold f z l) (fold f z r)(+)只接受两个参数,但当传入它时,它尝试计算如下:
(+) x (fold (+) z l) (fold (+) z r) -- 3 arguments! =P您可能希望使用二进制函数( ->、-> a)折叠。假设您想使用(+)。你希望结果是这样的:
fold f z (Node x l r) = x + (fold f z l) + (fold f z r)从这里可以很容易地概括:只需将+替换为固定的f
fold f z (Node x l r) :: (a -> a -> a) -> a -> BST a -> a
fold f z (Node x l r) = x `f` (fold f z l) `f` (fold f z r)https://stackoverflow.com/questions/4893323
复制相似问题