F# F中约束树数据结构的建模#

F# F中约束树数据结构的建模#,f#,tree,modeling,F#,Tree,Modeling,作为一名初级F#程序员,我读过类似的文章,这些文章描述了如何在F#中建模简单的树数据结构 我想对更复杂的树数据结构建模。考虑一棵树,它由一个具有许多子节点(主节点)的单个根组成,每个节点都有多个节点(次级节点)。 假设有三种类型的树,它们基于根的类型(注意,我说的是“种类”而不是“类型”——我还没有尝试假设任何模型) r1类的根可以有p1类的主节点和s1类的次节点 r2类的根可以有p2类的主节点和s2类的次节点 r3类的根可以有p3类的主节点和s3类的次节点 用F#来建模的好方法是什么?(注

作为一名初级F#程序员,我读过类似的文章,这些文章描述了如何在F#中建模简单的树数据结构

我想对更复杂的树数据结构建模。考虑一棵树,它由一个具有许多子节点(主节点)的单个根组成,每个节点都有多个节点(次级节点)。 假设有三种类型的树,它们基于根的类型(注意,我说的是“种类”而不是“类型”——我还没有尝试假设任何模型)

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

用F#来建模的好方法是什么?(注意:这是一个更复杂的数据结构的开始,其中节点可以有属性,当然也会有遍历树的操作,但我将把它保存下来,以备将来的问题使用。不过,作为一个示例,所有根节点可能都有一个名称,主节点有一个地址,次节点有一个电话号码。如果您在我们讨论这个问题时有想法的话这是我涂鸦的类型:

type Node<'v, 'c> = 
    {
        Value: 'v
        Children: 'c list
    }
类型节点=
{
值:'v
儿童:c名单
}
或者作为一个单一的歧视性联盟,如果您愿意:

type Node<'v, 'c> = N of 'v * 'c list
type Node=N个“v*”c列表
稍后,您可以像这样使用它来模拟您拥有的第一棵树的味道:

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

type Tree1 = Node<R1, Node<P1, S1>>
类型R1=obj
P1型=obj型
S1型=obj型
类型Tree1=节点
这里我假设您的
R1
P1
S1
类型实际上是您希望节点携带的数据


这样,树的最大深度和节点的类型将反映在类型签名中。可以说,这样你就无法拥有任意深度的树(甚至比几层还要深),因为树的类型会很快变得笨拙;)如果您只关心depth-3树,则不必担心。

主节点或次节点是可选的吗?根节点或节点可以有零个或多个节点(正确类型)。谢谢。因此,一个可以访问任何类型树的函数都有参数签名nodean任何类型的depth-3树,是的-更接近
noded你对“未来问题”部分有什么想法吗?例如,如果所有根节点都有一个名称,主节点有一个地址,次节点有一个电话号码,该怎么办。你的模型能帮助你处理所有类型的树吗?我想说这就是它的好处-那些
R1
等等。类型可以是任意的记录,你可以用任意的属性进行扩展。
节点
类型是树的形状,您实例化它的类型对树一无所知,它可以是您想要的任何类型的数据(例如,包括系统中已有的
地址
类型)。