4

请理解我昨天才开始编写 F#。

我在 c# 中有这个算法,我有一个节点列表,这些节点有一个子节点列表。

我怎样才能做到这一点?我知道 F# 处理不可变类型并且不鼓励更改变量/对象。有什么好方法呢?

C#

public class Node
{
    public List<Node> childrenNode = new List<Node>();
    public void AddChildren(Node node)
    {
        childrenNode.Add(node);
        node.Parent(this);
    }
}

F#

type Node(board:Board)=
     let mutable _childrenNode= Set.empty
     new() = Node()
     member AddChildren(node:Node)=
4

2 回答 2

4

在 F# 中表示树结构的最简单方法是使用可区分联合。这是一个示例,它还添加了在每个节点中存储值的功能:

type Tree<'T> =
    | Empty
    | Node of option<'T> * List<Tree<'T>>

因此,该Tree类型由两种情况组成——要么是一棵空树,要么是一个具有可选值的节点和一个子节点列表。

数据类型是不可变的,因此 add 函数要求您传递现有树以及附加节点列表:

let addChildren (nodes: list<Tree<'T>>) (tree: Tree<'T>) : Tree<'T> =
    match tree with
    | Empty        -> Node (None, nodes)
    | Node (v,chs) -> Node (v, chs @ nodes)

模式匹配用于区Tree分值的两种形状。

于 2013-10-02T14:40:56.460 回答
3

试试这个:

type Node() as this =
    let children = new ResizeArray<Node>()
    let mutable parent : Node = this
    member this.Parent with get() = parent
    member this.AddChild(node : Node) =
       children.Add(node)
       node.Parent <- this

这实际上与您的 C# 代码相同,尽管正如您所说,它确实非常反对 F# 思维方式。

于 2013-10-02T14:38:29.220 回答