Haskell - 每个节点中有两个变量的树

时间:2017-05-13 21:39:13

标签: haskell tree

我正在尝试定义一个树,每个节点中有两个值。一个表示节点的值,第二个表示距叶子的距离。

data Tree2 a b = Nil 0  | T (Tree2 a b) (a b) (Tree2 a b) deriving (Eq,Ord,Show,Read)

定义是否正确? “Nil 0”有意义吗?我想说的是,如果值不在树中而不是距离为0。

3 个答案:

答案 0 :(得分:6)

在每个节点上定义包含两个值的树是不必要的,因为您可以只使用在每个节点包含一个值的树,但它包含两个值的元组。

例如:

data Tree a = Nil | Node (Tree a) a (Tree a) deriving (Eq, Ord, Show, Read)

type Tree2 a b = Tree (a,b)

现在您拥有Tree2 Tree,它拥有getDistance :: (Num b) => Tree2 a b -> b getDistance Nil = 0 getDistance (Node _ (_,x) _) = x 的所有特征,但需要2个类型参数。

使用它的函数的一个例子是:

{{1}}

答案 1 :(得分:1)

我不这么认为。想想在Nil树上说'#34;停在这里,没有更多的叶子",所以不需要在那里添加数据,你只能说:

data Tree2 a b = Nil | T (Tree2 a Int) a Int (Tree2 a Int)

每次创建节点时计算右侧的距离。

getDistance :: Tree2 a Int -> Int
getDistance Nil              = 0
getDistance (T _ _ n _) = n  

答案 2 :(得分:0)

为了让它盲目编译我会这样写:

data Tree2 a b = Nil | T (Tree2 a b) (Tree2 a b)

这一个:

Nil 0

对我来说没有意义。

所以我会这样重写:

data Tree2 a = Nil | T a (Tree2 a) (Tree2 a)

如果您真的想在节点中存储两种类型a和b:它变为

data Tree2 a b = Nil | T a b (Tree2 a b) (Tree2 a b)

但是你的符号

(a b)

可能并不意味着你的意思。正如以下评论所言,在(a b)中,a将被理解为一种* - > *(您可以将其理解为期望其他类型的类型。

a设为[],将b设为Int(a b)将被理解为[Int]。如果aMaybe,而bString,则(a b)将为Maybe String。 这将是存储在树结构中的节点值。