【发布时间】:2013-11-12 13:11:54
【问题描述】:
我正在尝试将小型编译器从 C# 移植到 F#,以利用模式匹配和可区分联合等功能。目前,我正在使用基于 System.Linq.Expressions 的模式对 AST 进行建模:一个抽象基“表达式”类、每个表达式类型的派生类和一个 NodeType 枚举,允许在不进行大量转换的情况下切换表达式。我曾希望使用 F# 可区分联合大大减少这种情况,但我遇到了几个看似限制:
- 强制公共默认构造函数(我想对表达式构造进行类型检查和参数验证,就像 System.Linq.Expressions 对其静态工厂方法所做的那样)
- 缺少命名属性(似乎这在 F# 3.1 中已修复)
- 无法直接引用案例类型。例如,似乎我不能声明一个仅从联合中接受一种类型的函数(例如,
let f (x : TYPE) = x编译为Expression(联合类型)但不适用于Add或Expression.Add。这似乎以牺牲我的 C# 方法的一些类型安全性。
对于这些或设计模式是否有很好的解决方法可以让它们不那么令人沮丧?
【问题讨论】:
-
带你去一个不同的方向,你看过parser combinators,尤其是FParsec吗?
-
"好像我不能声明一个只从联合中接受一种类型的函数" 是的,因为 case 不是类型。您可以在鉴别器/大小写标记上“仅”进行模式匹配。