具有变量成员的树上的Haskell树折叠

自己12794

我正在尝试创建一个自定义数据类型Tree。定义如下:

可以将树定义为包含单个信息(即,它是没有子节点的节点)的叶子(由关键字“ Leaf”标识)或具有单个信息的节点(由关键字“ Node”标识)信息,再加上一棵树–列表中的每个元素代表一个以相应子节点为根的子树。请注意,在此定义下,树永远不能为空。这意味着一棵树可以是:

  • 叶数据;或者
  • 节点数据[数据,数据,...]-列表内可以有零棵或更多棵树

这是我的代码:

data Tree a = Leaf a | Node a [ Tree a ] deriving (Show)

foldt :: (a -> a -> a) -> Tree a -> a
foldt f (Leaf a)     = a
foldt f (Node a [])  = a
foldt f (Node a [b]) = f a (foldt f b)

它可以编译,但是当我尝试运行时:

let myTree = Node 'A' [Node 'B' [Leaf 'E', Node 'F' [Leaf 'I', Leaf 'J', Leaf 'K']], Node 'C' [Leaf 'G', Leaf 'H'], Leaf 'D']
foldt min myTree

而不是预期的输出'A',我得到以下错误:

CSC207a4.hs:(6,1)-(8,38): Non-exhaustive patterns in function foldt

我的函数的哪一部分不够详尽,或者我是否错误地定义了数据类型?

更新:

我可能已经解决了非穷举模式,但现在我有了这个,但它声称未定义Tree:

数据树a =叶a | 节点[树a]派生(显示)

foldt :: (a -> a -> a) -> Tree a -> a
foldt f (Leaf a)     = a
foldt f (Node a [])  = a
foldt f (Node a [(Tree x)])  = f a (foldt f x)
foldt f (Node a [(Tree x):xs]) = f a (foldt f (f x (foldt f xs)))
自己12794

我找到了答案。熬了一夜后,我有了灵感。这里是:

module CSC207a4 where

data Tree a = Leaf a | Node a [ Tree a ] deriving (Show)

foldt :: (a -> a -> a) -> Tree a -> a
foldt _ (Leaf a)    = a
foldt _ (Node a []) = a
foldt f (Node a b)  = f (foldt f x) (foldt f (Node a xs))
    where
        x:xs = b

这通过了所有测试用例,并回答了我的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有向量成员的对象的破坏

来自分类Dev

访问变量成员

来自分类Dev

具有常量成员的默认构造函数

来自分类Dev

具有 const 向量成员的类的复制构造函数

来自分类Dev

PHP常量成员变量

来自分类Dev

C ++ 11中的常量成员变量

来自分类Dev

VS2013:优化具有向量成员的类的移动语义的潜在问题?

来自分类Dev

VS2013:优化具有向量成员的类的移动语义的潜在问题?

来自分类Dev

具有功能分支的Haskell树

来自分类Dev

具有功能分支的Haskell树

来自分类Dev

私有类型的静态常量成员

来自分类Dev

Haskell折叠玫瑰树路径

来自分类Dev

Haskell折叠玫瑰树路径

来自分类Dev

如何使用“ e”个变量成员创建事件?

来自分类Dev

在名称空间范围之外定义名称空间的变量成员

来自分类Dev

在继承的类中重新定义常量成员变量

来自分类Dev

在名称空间范围之外定义名称空间的变量成员

来自分类Dev

在继承的类中重新定义常量成员变量

来自分类Dev

从自定义标签访问QML嵌套变量成员

来自分类Dev

如何自动更新类的变量成员?

来自分类Dev

使用具有多个函数的闭包而不在Python中使变量成为全局变量

来自分类Dev

Haskell数据树的可折叠实例

来自分类Dev

如何在所有可能的子树上分割树?

来自分类Dev

初始化后,Const_iterator成员变量未指向向量成员变量的开头

来自分类Dev

具有非树数据的可折叠D3力导向图

来自分类Dev

同时展开和折叠具有相同结构的两棵树

来自分类Dev

g ++ std :: variant似乎不支持带有std :: atomic / std :: mutex变量成员的用户类(带有详细信息/代码)

来自分类Dev

将变量折叠为一个具有保留变量名称的值的变量

来自分类Dev

使用rpart构建具有分类变量的分类树

Related 相关文章

  1. 1

    具有向量成员的对象的破坏

  2. 2

    访问变量成员

  3. 3

    具有常量成员的默认构造函数

  4. 4

    具有 const 向量成员的类的复制构造函数

  5. 5

    PHP常量成员变量

  6. 6

    C ++ 11中的常量成员变量

  7. 7

    VS2013:优化具有向量成员的类的移动语义的潜在问题?

  8. 8

    VS2013:优化具有向量成员的类的移动语义的潜在问题?

  9. 9

    具有功能分支的Haskell树

  10. 10

    具有功能分支的Haskell树

  11. 11

    私有类型的静态常量成员

  12. 12

    Haskell折叠玫瑰树路径

  13. 13

    Haskell折叠玫瑰树路径

  14. 14

    如何使用“ e”个变量成员创建事件?

  15. 15

    在名称空间范围之外定义名称空间的变量成员

  16. 16

    在继承的类中重新定义常量成员变量

  17. 17

    在名称空间范围之外定义名称空间的变量成员

  18. 18

    在继承的类中重新定义常量成员变量

  19. 19

    从自定义标签访问QML嵌套变量成员

  20. 20

    如何自动更新类的变量成员?

  21. 21

    使用具有多个函数的闭包而不在Python中使变量成为全局变量

  22. 22

    Haskell数据树的可折叠实例

  23. 23

    如何在所有可能的子树上分割树?

  24. 24

    初始化后,Const_iterator成员变量未指向向量成员变量的开头

  25. 25

    具有非树数据的可折叠D3力导向图

  26. 26

    同时展开和折叠具有相同结构的两棵树

  27. 27

    g ++ std :: variant似乎不支持带有std :: atomic / std :: mutex变量成员的用户类(带有详细信息/代码)

  28. 28

    将变量折叠为一个具有保留变量名称的值的变量

  29. 29

    使用rpart构建具有分类变量的分类树

热门标签

归档