我试图了解函数类型的方差规则。似乎他们不会将输入和输出视为相同(直到对偶)。考虑这个程序。
let mk1 s = s |> Seq.iter (fun _ -> ())
// val mk1 : s:seq<'a> -> unit
let mk2 = mk1 : list<int> -> unit // Ok.
let mk3 () = [1]
// val mk3 : unit -> int list
let mk4 = mk3 : unit -> seq<int> // Type mismatch.
这是错误:
Type mismatch. Expecting a
unit -> seq<int>
but given a
unit -> int list
The type 'seq<int>' does not match the type 'int list'
我的理解seq<int>
是一种接口类型,一种int list
实现,所以我期待这个转换通过(*)。
两个问题:
- 为什么不呢?
- 为什么演员阵容
mk2
正常?
(*) 对于理论家:我期待阐述者在函数空间类型构造函数的输入和输出位置表现出双重行为。那是错的吗?