给定 AST 的 DU(一个非常简单的表达式树)
type Expression =
| Add of list<Expression>
| Var of string
| Val of float
Run Code Online (Sandbox Code Playgroud)
我想写一个运算符+,以便我可以写
let x = "s" + 2.0
Run Code Online (Sandbox Code Playgroud)
并且有
x = Add [(Var "s"); (Val 2.0)]
Run Code Online (Sandbox Code Playgroud)
此外,我希望它可以从其他程序集中使用(通过打开一些东西)。
我的实际应用程序是一个类似但更大的 DU,用于真正的 AST。我在 F# 4.8 上。
到目前为止有效的是
let (+) a b =
Add [a; b]
x = (Var "s") + (Val 2.0)
Run Code Online (Sandbox Code Playgroud)
但是在这里我还是要包"s"和"2.0"手工制作。我想避免这种包装。
我尝试了其他几件事:
声明类型扩展和接口并使用静态类型参数和接口约束:
首先是接口
type IToExpression =
abstract member ToExpression : Expression
type Expression with
member this.ToExpression …Run Code Online (Sandbox Code Playgroud)