Haskell定义二叉树

时间:2015-02-28 01:06:20

标签: haskell functional-programming binary-tree

我想使用infinitree :: Tree在Haskell中定义一个无限树,但是想为每个节点设置一个模式,定义每个节点应该是什么。模式比其父模式多1个。我正在努力设置如何设置一个树,以及如何以及在何处定义每个节点的模式?

谢谢

2 个答案:

答案 0 :(得分:4)

无限数据结构通常可以由调用自身但没有基本情况的函数定义。通常这些函数不需要对其参数进行模式匹配。例如,等于[1..]的列表可以写为

infiniteList :: [Int]
infiniteList = go 1 where 
  go n = n : go (n+1) 

您可以对树使用完全相同的技术:

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

infiniteTree :: Tree Int 
infiniteTree = go 1 where 
  go n = Node (go (2*n)) n (go (2*n+1))

这定义了无限树

   1 
 /   \
 2   3 
/ \ / \
4 5 6 7
...

答案 1 :(得分:1)

没有叶子的无限二叉树的类型:

data Tree a = Tree (Tree a) a (Tree a)

执行此类操作的一种常规模式称为unfold。对于这种特殊类型:

unfold :: (a -> (a,b,a)) -> a -> Tree b

您能看到如何定义此功能并将其用于您的目的吗?