【问题标题】:Haskell - tree with two variables in each nodeHaskell - 每个节点中有两个变量的树
【发布时间】:2017-09-05 18:27:56
【问题描述】:

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

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

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

【问题讨论】:

  • (a b) 你的意思是写(a,b) 还是a b?因为(a b) 定义了一个参数,其中ba 的类型参数
  • 我想定义两个参数
  • 似乎不需要两个参数。您可以只定义一个带有一个参数的树,其中的值是两个值的元组。
  • 你能在这里写一个例子吗?请

标签: haskell tree


【解决方案1】:

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

例如:

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

type Tree2 a b = Tree (a,b)

现在你有了一个Tree2,它拥有Tree 的所有特性,但需要2 个类型参数。

使用它的函数示例如下:

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

【讨论】:

    【解决方案2】:

    我不这么认为。把 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  
    

    【讨论】:

    • 我以为你想计算距离,所以我想如果你在那里添加它,每次添加一个节点(如果你创建函数)你可以自动计算距离,当你想要它,只需获取价值
    • 是的,我只是想知道,为什么正好在右子树中,但现在它更有意义了:]
    • 是的,当然,很高兴为您提供帮助,您的问题很有趣。我能知道你为什么要使用那个数据结构吗?
    • 是的,我正在尝试编写一个程序,它接受一棵树作为输入,并且程序必须根据与叶子的距离输出一个排序列表。
    • @DamianLattenero 一般来说,人们不会大声地对其他人的帖子进行大量编辑,因为这些帖子会将话放在别人的嘴里。编辑可以更改帖子的格式和措辞,但不能更改含义。如果您希望您的帖子是社区的努力,而不是您自己的,您应该将您的帖子设为社区 wiki。否则,如果人们想要做出有意义的补充,就应该写下自己的答案。
    【解决方案3】:

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

    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[],而bInt(a b) 将被理解为[Int]。假设aMaybebString(a b) 将被理解为Maybe String。 那将是存储在树结构中的节点值。

    【讨论】:

    • 实际上,我认为这可能起作用。 a 必须实例化为 * -> * 类型,这可能是各种有用的东西,如 (,) Int、Identity、Maybe 等。
    • 你确定元组 (,) 不是那种 * -> * -> * 吗?
    • 是的,但我写的部分适用于Int
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多