在F#

时间:2015-07-06 17:51:01

标签: f# tree modeling

作为F#程序员的开始,我读过像this one这样的文章,描述了如何在F#中建模简单的树数据结构。

我想建模更复杂的树数据结构。考虑一个由单个根组成的树,该根具有多个子节点(主节点),每个节点都有多个节点(辅助节点)。

假设树有三种口味,它们基于根的种类(注意我说“亲切”而不是“类型” - 我还没有尝试任何模型。)

  • 种类r1的根可以具有种类p1的主节点和种类s1的次节点。
  • 种类r2的根可以具有种类p2的主节点和种类s2的次节点。
  • 类型r3的根可以具有类型为p3的主节点和类型为s3的次节点。

在F#中对此进行建模的好方法是什么? (注意:这是一个更复杂的数据结构的开始,其中节点可以有属性,当然会有遍历树的操作,但我会保存它以用于将来的问题。但是,作为一个例子,所有的根节点可能有一个Name,主节点有一个地址,辅助节点有一个电话号码。如果你对此有想法,请提及。)

1 个答案:

答案 0 :(得分:2)

这是我涂鸦的类型:

type Node<'v, 'c> = 
    {
        Value: 'v
        Children: 'c list
    }

或作为单一案例歧视联盟,如果您愿意:

type Node<'v, 'c> = N of 'v * 'c list

您可以在以后使用这样来模拟您拥有的第一个树味:

type R1 = obj
type P1 = obj
type S1 = obj

type Tree1 = Node<R1, Node<P1, S1>>

我假设您的R1P1S1类型实际上是您希望节点携带的数据。

这样,树的最大深度和节点类型将反映在类型签名中。可以说,你不可能有任意深度的树(甚至更深层次),因为树的类型很快会变得笨重;)如果你只关心深度3树,那不是一个问题。