Haskell树,每个节点中有两个变量

Haskell树,每个节点中有两个变量,haskell,tree,Haskell,Tree,我试图定义一个树,每个节点有两个值。一个表示节点的值,第二个表示到叶子的距离 data Tree2 a b = Nil 0 | T (Tree2 a b) (a b) (Tree2 a b) deriving (Eq,Ord,Show,Read) 定义正确吗?“零0”有意义吗?我想说的是,如果值不在树中,那么距离就是0。我不这么认为。将Nil树视为一种表示“到此为止,没有更多树叶”的方式,因此无需在那里添加数据,您只能说: data Tree2 a b = Nil | T (Tree2 a

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

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

定义正确吗?“零0”有意义吗?我想说的是,如果值不在树中,那么距离就是0。

我不这么认为。将Nil树视为一种表示“到此为止,没有更多树叶”的方式,因此无需在那里添加数据,您只能说:

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  

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

data Tree2 a b = Nil | T (Tree2 a b) (Tree2 a b)
data Tree2 a = Nil | T a (Tree2 a) (Tree2 a)
这个:

Nil 0
对我来说没有意义

所以我会这样写:

data Tree2 a b = Nil | T (Tree2 a b) (Tree2 a b)
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
可能
,而
b
字符串
(a b)
将被理解为
可能字符串

这就是存储在树结构中的节点值。

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

例如:

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

type Tree2 a b = Tree (a,b)
现在您有了一个
Tree2
,它拥有
树的所有特性,但需要两个类型参数

使用它的函数示例如下:

getDistance :: (Num b) => Tree2 a b -> b
getDistance Nil              = 0
getDistance (Node _ (_,x) _) = x

我认为您想要计算距离,因此我认为如果您在那里添加距离,每次添加节点时(如果您创建函数)你可以自动计算距离,当你需要的时候,只需要得到值是的,我只是想知道,为什么精确地在正确的子树中,但现在它变得更有意义了:]是的,当然,我很高兴帮助你,你的问题很有趣。我能知道你为什么要使用这个数据结构吗?是的,我正在尝试编写一个程序,它接受输入树和程序必须按离叶子的距离输出一个排序的列表。@Damianaltenero一般来说,人们不会大声对别人的帖子进行实质性的编辑,因为这些帖子会把话塞进别人的嘴里。编辑可以改变帖子的格式和措辞,但不能改变帖子的含义。如果你想让自己的帖子成为社区的一部分,而不是你自己的,你应该这样做把你的文章变成一个社区维基。否则,如果人们想做一个有意义的补充,他们应该写自己的答案。你的意思是写
(a,b)
还是
ab
?因为
(a,b)
定义了一个参数,其中
b
a
的类型参数。我想定义两个参数。需要两个参数似乎是不必要的。你可以定义一个树,它包含一个参数,其中值是两个值的元组。你能在这里写一个例子吗?事实上,我认为这可能有用k、
a
必须被实例化为一种类型的
*->*
,它可能是各种有用的东西,比如
(,)Int
,Identity,
可能是
,等等。你确定元组(,),它不是那种类型的*->*->*?是的,但我写的它部分应用于
Int