haskell - 将所有节点总结为具有泛型类型的树。(哈斯克尔)
问题描述
我一直在尝试编写一个代码来获取树中的所有整数并返回它们的总和。我正在尝试使用 type 来执行此操作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
为零,老实说我不明白为什么。我已经修改了我的代码部分,但一次都没有成功,我真的可以使用一些帮助。
解决方案
x (+) (countTree p k y) (+) (countTree p k z)
正在尝试将x
其视为一个函数,并将所有的参数作为参数传递给它
(+) (countTree p k y) (+) (countTree p k z)
如果你想要“x + recur left + recur right”,你会想要这样的东西:
x + (countTree p k y) + (countTree p k z)
我很确定您实际上想要使用p
,而不是+
硬编码。使用前缀表示法,您必须将其重新排列为:
(p (p x (countTree p k y)) (countTree p k z))
或者,您可以p
按照@bipll 的建议使用反引号内联调用:
x `p` (countTree p k y) `p` (countTree p k z)
附注,但我也很确定你想h
成为k
.
推荐阅读
- bash - 在 shell 变量中看不到 * 显示文件夹中的文件
- angular - ngOnInit 没有调用路由更改
- python - 如何以 python 方式翻译此工作代码
- swift - 浮点和双网络字节顺序
- javascript - 如何替换嵌套对象中的键
- angular - 将数据从外部应用程序传递到 Angular 应用程序
- python - 禁用不和谐的“错误命令”错误?
- python - Django def form_valid 有两种形式
- javascript - 你可以在不使用 document.write() 的情况下销毁文档元素和事件侦听器吗?
- elasticsearch - read_only_allow_delete 意外重置