次の型を使用して、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