我有一个像这样的表达式的可区分联合(EQ =; GT >; 等)
(AND (OR (EQ X 0)
(GT X 10))
(OR (EQ Y 0)
(GT Y 10)))
我想从文件/数据库中保存的此类表达式创建 DU 实例。 我该怎么做?如果不可行,在 F# 中实现它的最佳方法是什么?
Daniel:这些表达式以前缀格式(如上所述)保存为文本,并将在 F# 中进行解析。谢谢。
最佳答案
如果您只是想知道如何使用 DU 对这些表达式进行建模,这里有一种方法:
type BinaryOp =
| EQ
| GT
type Expr =
| And of Expr * Expr
| Or of Expr * Expr
| Binary of BinaryOp * Expr * Expr
| Var of string
| Value of obj
let expr =
And(
Or(
Binary(EQ, Var("X"), Value(0)),
Binary(GT, Var("X"), Value(10))),
Or(
Binary(EQ, Var("Y"), Value(0)),
Binary(GT, Var("Y"), Value(10))))
现在,这可能太“宽松”,即它允许像 And(Value(1), Value(2))
这样的表达式,根据您的语法,这些表达式可能无效。但这应该让您了解如何处理它。
还有一些good examples在 F# 编程 wiki 书中。
如果你需要解析这些表达式,我强烈推荐FParsec .
关于f# - 从文件/数据库创建可区分的联合数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14569582/