F#类型构造函数不像函数那样

bri*_*rns 11 f# discriminated-union

如果我定义这样的类型:

type Foo = Items of seq<int>
Run Code Online (Sandbox Code Playgroud)

我可以创建Foo如下:

Items [1;2;3]
Run Code Online (Sandbox Code Playgroud)

但是,以下不起作用:

[1;2;3] |> Items
Run Code Online (Sandbox Code Playgroud)

错误消息是:

Type mismatch. Expecting a
    int list -> 'a    
but given a
    seq<int> -> Foo
Run Code Online (Sandbox Code Playgroud)

编译器不应该能够转换int list成一个seq<int>?如果Items构造函数是一个普通函数,我可以调用它:

let length ints = Seq.length ints
printfn "%A" (length [1;2;3])
printfn "%A" ([1;2;3] |> length)
Run Code Online (Sandbox Code Playgroud)

jpi*_*son 2

这更多的是猜测而不是答案,但我怀疑这个问题可能与 C# 中的类似行为有关,因为构造函数不能具有类型参数。默认情况下,我的理解是 F# 函数是完全通用的,只有通过类型注释和推理才能变得专门化。如果构造函数无法具有类型参数是 CLR 或 .NET 中普遍存在的问题,那么它可以解释为什么 F# 类型构造函数可能无法遵循与函数相同的默认行为。