将所有节点汇总为具有通用类型的树。 (哈斯克尔)

时间:2018-11-10 00:18:52

标签: haskell

我一直试图编写一个代码,该代码将一棵树中的所有整数都返回并求和。我正在尝试使用类型a进行此操作,该类型来自数据时间:

data Tree a = Nil | Value a (Tree a) (Tree a) deriving Show

,我们要使用: tree = Value 2 (Value 2 (Value 2 Nil Nil) Nil) (Value 2 Nil Nil)

我的代码如下:

countTree :: (a -> a -> a) -> a -> Tree a -> a
countTree p k (Nil) = h
countTree p k (Value x y z) = x (+) (countTree p k y) (+) (countTree p k z) 

,我想将代码运行为countTree (+) 0 tree,结果应返回8。 问题是,当我运行代码时,它告诉我x有四个参数,但是类型a却为零,我真的不明白为什么。我已经修改了我的代码部分,但是一次都没有成功,我真的可以使用一些帮助。

1 个答案:

答案 0 :(得分:3)

SELECT count(*) FROM(
SELECT item FROM s1
INTERSECT
SELECT item FROM s2
INTERSECT
SELECT item FROM s4
EXCEPT
SELECT item FROM s3);

试图将x (+) (countTree p k y) (+) (countTree p k z) 视为一个函数,并将

都作为参数传递给它
x

如果您想使用“ x +向左递归+向右递归”,则需要以下内容:

(+) (countTree p k y) (+) (countTree p k z)

我很确定,但是您实际上想使用x + (countTree p k y) + (countTree p k z) ,而不是p硬编码。使用前缀表示法,您必须将其重新排列为:

+

或者,您可以按照@bipll的建议使用反引号将对(p (p x (countTree p k y)) (countTree p k z)) 的调用内联:

p

旁注,但我也很确定您希望x `p` (countTree p k y) `p` (countTree p k z) 成为h