【发布时间】:2014-05-30 01:33:56
【问题描述】:
与seq<seq<'a>> 相比,# 在类型签名(如seq<#seq<'a>>)中的含义是什么?
【问题讨论】:
标签: casting f# symbols type-signature
与seq<seq<'a>> 相比,# 在类型签名(如seq<#seq<'a>>)中的含义是什么?
【问题讨论】:
标签: casting f# symbols type-signature
这称为弹性类型。简短的总结是#type 表示从type 继承的任何 类型。因此,在您的具体示例中,seq<#seq<'a>> 将是包含 'a 值的任何集合的序列。
在调用函数时,F# 会自动将具体类型转换为接口 - 例如,您可以调用以数组 'a[] 为参数的函数,该函数以 seq<'a> 为参数。但是,当您有数组时,这不起作用 - 因为 'a[][] 仅实现 seq<'a[]> 而不是 seq<seq<'a>>。
例如,以下两个函数返回嵌套序列的长度列表:
let f1 (s:seq<seq<'T>>) = [ for i in s -> Seq.length i ]
let f2 (s:seq<#seq<'T>>) = [ for i in s -> Seq.length i ]
但在列表列表中只能调用第二个:
[ [1]; [2;3] ] |> f1
// error FS0001: The type 'int list list' is not
// compatible with the type 'seq<seq<'a>>'
[ [1]; [2;3] ] |> f2
// val it : int list = [1; 2]
【讨论】: