如何将F#函数参数约束到PropertyGet?

时间:2013-11-23 16:04:33

标签: f#

我有一些代码需要一个表达式并使用它就好了;麻烦的是,我传递的表达式是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

当然,这不会编译。所需的属性是:编译时检查 - 它更安全,我担心的例外更少。但是如何到达那里?

1 个答案:

答案 0 :(得分:1)

这是不可能的。 F#中的歧视联盟,即使它们被编译成类层次结构,也不允许将这些案例用作正确的类型。在Scala中,等价物可能与case类有关,但我相信ML派生语言都不允许这样做。