【问题标题】:How to define a tree data structure that has edge type如何定义具有边缘类型的树数据结构
【发布时间】:2018-05-04 02:27:54
【问题描述】:

我想定义一个树形数据结构,它的边缘有一个标签,这是我最初的想法:

sealed trait Tree[+N,+E]
case class Branch[N,E](value:N, children:Map[E, Tree[N,E]]) extends Tree[N,E]
case class Leaf[N](value:N) extends Tree[N, Unit]

你可能猜到了,如果我像下面这样创建一个树实例,实例的类型将是Tree[Int, Any]。我也不想为E 提供逆变类型。

  val tree =
    Branch(0,
      Map(
        "a" -> Leaf(1),
        "b" -> Branch(2,
          Map(
            "c" -> Leaf(4))))
    )

我想知道实现这个 Tre 的更好方法。我听说过 Fix 类型类和递归方案,但我不知道它们在这里是否有用。

【问题讨论】:

    标签: scala types functional-programming


    【解决方案1】:

    Leaf 扩展Tree[N, Nothing],而不是Tree[N, Unit]Nothing 是底部类型,因此这意味着 Leaf[N] 将是任何 ETree[N, E] 的子类型,因为它是协变的。

    case class Leaf[N](value:N) extends Tree[N, Nothing]
    

    通过该更改,您的示例树定义可以正常工作。

    固定点类型更复杂,但并不总是必要的。但是您当然可以修改它以使用它们。如果您确实想走这条路,最好将其作为另一个更具体的问题提出。

    【讨论】:

    • 是的,我忘了放扩展,如果我什么都没有扩展 Leaf,它可以正常工作,我很粗心!
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2014-06-16
    • 2020-01-22
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多