パターン マッチングや判別共用体などの機能を利用するために、小さなコンパイラを C# から F# に移植しようとしています。現在、私は System.Linq.Expressions に基づくパターンを使用して AST をモデル化しています: 抽象基本 "Expression" クラス、各式タイプの派生クラス、および多数のキャストなしで式を切り替えることができる NodeType 列挙型。F# 判別共用体を使用してこれを大幅に削減することを望んでいましたが、いくつかの制限に遭遇しました。
- 強制的なパブリック デフォルト コンストラクター (System.Linq.Expressions が静的ファクトリ メソッドで行うように、式の構築で型チェックと引数の検証を行いたい)
- 名前付きプロパティの欠如 (これは F# 3.1 で修正されたようです)
- ケースタイプを直接参照できない。たとえば、共用体から 1 つの型のみを受け取る関数を宣言できないようです (たとえば、 (共用体型)
let f (x : TYPE) = x
に対してコンパイルしますが、 orに対してはコンパイルしません。これは、私の C# アプローチよりも型の安全性を犠牲にしているようです。Expression
Add
Expression.Add
イライラを軽減するこれらまたは設計パターンの適切な回避策はありますか?