Haskell预订遍历二叉树

时间:2018-01-21 03:22:58

标签: haskell functional-programming binary-tree tree-traversal preorder

我正在尝试编写一个遍历二叉树并返回遇到的整数列表的函数。 我的数据树声明如下:

data Tree = Node Int Tree Tree | Leaf Int
   deriving (Eq,Show)

我的第一个想法是启动该功能:

preorder :: Tree -> [a]  --take in tree, return list of ints

但是我看到有些人通过使用类似于:

的函数声明格式在线解决这个问题
preorder :: (a -> c) -> (b -> c) -> Tree -> [c]

我真的不明白这条线在做什么,是否需要多次输入?

由于

1 个答案:

答案 0 :(得分:3)

它将取决于树的基础定义。他们可能正在使用另一个树定义,常见的是:

data Tree a b = Leaf b | Branch a (Tree a b) (Tree a b)

因此,他们可能需要获取将ab类型的值映射到类型c的函数。由于您的树定义只包含Int类型的元素,因此preorder函数的类型为Tree -> [Int]就足够了。

<强>更新

如果要在树的元素类型中对树进行泛化,可以声明此数据类型:

data Tree a = Leaf a | Node a (Tree a) (Tree a)

使用此定义,您可以按如下方式定义preorder函数的类型:

preorder :: Tree a -> [a]