我正在尝试使用以下类型在 F# 中表示树数据结构:
type Node =
val mutable left: Node option
val mutable right: Node option
val mutable value: int
new (l, r, v) = {left = l; right = r; value = v}
我可以像这样创建一棵树:
let root = new Node (Some (new Node (None, None, 2)), Some (new Node (None, None, 3)), 1)
我现在想使用模式匹配进行遍历。但是,我不知道如何对对象进行模式匹配。我试过这样的事情:
let rec traverse r =
match r with
| Node (None, None, v) -> printfn "%d" v
并停在那里,因为模式匹配是错误的。
编辑:在 Petricek 的回答之后,我没有使用他的所有建议,因为我还没有读过关于歧视工会和其他阶级特征的文章。一旦我对这些事情有了更多的了解,我就会实施。但就暂时而言,这就是它的样子:
type Node =
val left: Node option
val right: Node option
val value: int
new (l, r, v) = {left = l; right = r; value = v}
let (|Node|) (nd: Node) = (nd.left, nd.right, nd.value)
let root = new Node (Some (new Node (None, None, 2)), Some (new Node (None, None, 3)), 1)
let rec traverseLRtR r =
match r with
| Node (None, None, v) -> printfn "%d" v
| Node (left, right, v) -> traverseLRtR left.Value; traverseLRtR right.Value; printfn "%d" v;
traverseLRtR root
输出是:
2
3
1