如何构造构造函数参数?

时间:2015-01-27 13:38:12

标签: f# pattern-matching

在F#中,我可以在语法中的各个地方使用模式匹配。

例如:

// Given this type...
type SingleCaseUnion = | SingleCaseUnion of int

/// ...I can do this:
let destructureInFunc (SingleCaseUnion n) =
    printfn "%d" n

// ...and this:
type DestructureInMethod() =
    member t.M(SingleCaseUnion n) =
        printfn "%d" n

但我无法弄清楚如何做到这一点:

type DestructureInCtor(SingleCaseUnion n) =
    do printfn "%d" n

//  type DestructureInCtor(SingleCaseUnion n) =
//  ---------------------------------------^
//
// stdin(3,40): error FS0010: Unexpected identifier in type definition. Expected ')' or other token.

我的语法错误,或者F#不支持构造函数参数中的模式匹配吗?

1 个答案:

答案 0 :(得分:5)

不,language spec明确说不:

primary-constr-args : attributesopt accessopt (simple-pat, ... , simplepat)
simple-pat :
 | ident
 | simple-pat : type

正如已经指出的那样,辅助构造函数是允许模式匹配的参数,但与主构造函数的不同之处在于每个主要参数都是函数参数私有字段声明。 / p>

如果F#允许模式匹配,那么会有一些模式会破坏这种单参数 - 一个字段的关系。

type DestructureInCtor(SingleCaseUnion _) = 
    // doesn't declare a private field

或:

type DestructureInCtor((a:int, b:int)) = 
    // declares two private fields? 

这可能有用,但我猜测允许模式匹配扩展到提供字段声明的复杂性超过了它的好处。