他のタイプのノードの中でも、いくつかのタイプのバイナリ ノードを持つツリーのタイプ定義を考えてみましょう。つまり、
type Tree =
| BinaryNodeA of Tree * Tree
| BinaryNodeB of Tree * Tree
| [Other stuff...]
たとえば、任意の種類のバイナリ ノードのサブノードを (新しいノードを構築することによって) 交換できる再帰関数を使用して、このツリーを操作したいと考えています。私を夢中にさせている問題: すべての BinaryNodes を一致させて Node フレーバーが「パラメーター」になり、そのフレーバーのスワップされたノードを返すために任意の BinaryNode フレーバーに適用できる汎用スワップを持たせるにはどうすればよいですか?
アクティブなパターンを使用して、BinaryNode であるすべての Tree を一致させる方法を知っています。
let (|BinaryNode|_|) (tree : Tree) =
match tree with
| BinaryNodeA _ | BinaryNodeB _ -> Some(tree)
| _ -> None
しかし、次のことは達成できないように見えるため、それだけでは十分ではありません。
match tree with
| [cases related to unary nodes..]
| BinaryNode a b -> BinaryNode b a
つまり、BinaryNode フレーバーをあたかも a や b のようにパラメーターとして使用する方法が見つかりませんでした。代わりに、各 BinaryNode フレーバーを個別に一致させる必要があるようです。多数のバイナリ ノード フレーバーが存在する場合、これは実用的な意味を持つ可能性があります。型ツリーは、Fsyacc/Fslex で生成されたパーサー/レクサーの AST であり、それを再構築するためのオプションを制限します。何か案は?