我正在尝试定义一个树,每个节点中有两个值。一个表示节点的值,第二个表示距叶子的距离。
data Tree2 a b = Nil 0 | T (Tree2 a b) (a b) (Tree2 a b) deriving (Eq,Ord,Show,Read)
定义是否正确? “Nil 0”有意义吗?我想说的是,如果值不在树中而不是距离为0。
答案 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]
。如果a
为Maybe
,而b
为String
,则(a b)
将为Maybe String
。
这将是存储在树结构中的节点值。