我有一些代码需要一个表达式并使用它就好了;麻烦的是,我传递的表达式是PropertyGet的约束是运行时约束,而不是编译时间:
member x.f(propertyExpr) =
match propertyExpr with
| PropertyGet(_, propOrValInfo, _) -> () // do something
| _ -> failwith "Unexpected expression type; needs PropertyGet"
我真正喜欢的是在编译时约束表达式的类型。以下说明了我的意图:
member x.f(propertyExpr: Expr.PropertyGet) =
() // do something
当然,这不会编译。所需的属性是:编译时检查 - 它更安全,我担心的例外更少。但是如何到达那里?
答案 0 :(得分:1)
这是不可能的。 F#中的歧视联盟,即使它们被编译成类层次结构,也不允许将这些案例用作正确的类型。在Scala中,等价物可能与case类有关,但我相信ML派生语言都不允许这样做。