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