Ответ 1
Дизайн, предложенный Асти, также станет моим первым выбором. В зависимости от ваших требований, это может быть все, что вам нужно.
Однако он также позволяет вам скомпилировать выражение типа
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;}))