小编HTC*_*HTC的帖子

在 F# 中强制内部 DSL 的现有类型

给定 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)

generics f#

4
推荐指数
1
解决办法
63
查看次数

标签 统计

f# ×1

generics ×1