f# - 从文件/数据库创建可区分的联合数据

标签 f# discriminated-union

我有一个像这样的表达式的可区分联合(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/

相关文章:

f# - 理解受歧视联合的推论

enums - 从没有模式匹配的枚举中读取

.net-core - 如何在 FSharp.Data.GraphQL 中实现批处理?

f# - 嵌套循环和函数式编程

f# - Seq.filter 和 infinite 似乎违反直觉

generics - 将 F# 泛型函数限制为联合类型?

F#:将受歧视的联合和类层次结构结合在一起?

reflection - F#:受歧视联合字段的属性?

list - 空列表中的 F# 值限制

.net - 如何在 OSX 上安装 MSBUILD?