假设我正在使用F#构建特定领域语言的解析器。我已经定义了一个判别式联合来表示表达式:
现在,我已经构建了一个类型为
这个函数定义如下:
type Expression =
| Equality of Expression*Expression
| NonEquality of Expression*Expression
| Or of Expression*Expression
| And of Expression*Expression
| If of Expression*Expression
| IfElse of Expression*Expression*Expression
| Bool of bool
| Variable of string
| StringLiteral of string
现在,我已经构建了一个类型为
Expression
的AST,并希望为其生成代码。
我有一个函数,它对表达式进行类型推断和类型检查。这个函数定义如下:
let rec InferType expr =
match expr with
| Equality(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
| Or(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
| And(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
...
我还有另一个函数可以生成遵循相似模式的代码:接收一个表达式,在联合中的每个项上编写模式匹配语句。
我的问题是:这是在 F# 中惯用的方法吗?
我认为,如果联合的每个成员本地定义自己的 InferType
和 GenerateCode
,代码会更加简洁。
如果我使用 C#,我会定义一个名为 Expression
的抽象基类,其中包含虚方法 InferType
和 GenerateCode
,然后在每个子类中重写它们。
还有其他方法可以实现吗?