アスティによって提案されたデザインも私の最初の選択です。要件に応じて、それだけで十分です。
それは、しかし、また、あなたが望むものはおそらくない
Add(Val(System.Console.Out), Val(System.Console.Error))
のような表現をコンパイルすることができますありません。
また、あなたはこのような表現をモデル化することができます:
open System
type IntExpression =
| Integer of int
| Mul of IntExpression * IntExpression
| Add of IntExpression * IntExpression
type DateTimeExpression =
| Date of DateTime
| Add of DateTimeExpression * DateTimeExpression
type MyExpression =
| IntExpression of IntExpression
| DateTimeExpression of DateTimeExpression
これは明らかに、より詳細な型定義であるが、それは式が整数またはDateTime
値のいずれかのリーフ・ノードを含むことができ、ルールを具現化し、そしてそれ以外の値はありません - もしそれがあなたが強制したいルールなら。
私はこれがより良いと主張していません。私は代わりを提供しているだけです。
使用法:
> IntExpression(Mul(IntExpression.Add(Integer(1), Integer(2)),Integer 3));;
val it : MyExpression =
IntExpression (Mul (Add (Integer 1,Integer 2),Integer 3))
> DateTimeExpression(Add(Date(DateTime.MinValue),Date(DateTime.MinValue)));;
val it : MyExpression =
DateTimeExpression
(Add
(Date 01.01.0001 00:00:00 {Date = 01.01.0001 00:00:00;
Day = 1;
DayOfWeek = Monday;
DayOfYear = 1;
Hour = 0;
Kind = Unspecified;
Millisecond = 0;
Minute = 0;
Month = 1;
Second = 0;
Ticks = 0L;
TimeOfDay = 00:00:00;
Year = 1;},
Date 01.01.0001 00:00:00 {Date = 01.01.0001 00:00:00;
Day = 1;
DayOfWeek = Monday;
DayOfYear = 1;
Hour = 0;
Kind = Unspecified;
Millisecond = 0;
Minute = 0;
Month = 1;
Second = 0;
Ticks = 0L;
TimeOfDay = 00:00:00;
Year = 1;}))
これは、制限の一部を処理し、それらのすべてではない - 次は賢明な表現ではありませんが、それはチェックを入力します ')(ムルを日付(DateTime.Nowを追加します(整数1、整数2)) ' –