有人可以分析这种方法签名的含义吗?
/// Returns a new map made from the given bindings.
/// elements: The input sequence of key/value pairs.
val ofSeq : elements:seq<'Key * 'T> -> Map<'Key,'T> when 'Key : comparison
以下是它的使用方法:
let grid = [ for i in 0..8 -> (i, true) ] |> Map.ofSeq
具体来说,有人可以将这个方法签名分解成段并解释每个段的功能吗?
注:
我是F#的新手,并且确实想要了解该语言的低级细节。
答案 0 :(得分:4)
val ofSeq : elements : seq<'Key * 'T> -> Map<'Key,'T> when 'Key : comparison
让我们分解吧。首先,箭头的存在意味着它是一种功能。
简单地说,每个箭头都说,当我在左边给它类型的东西时,我会把东西放在右边。请注意,F#支持curried参数,这意味着我可以一次提供一个参数,在返回函数的过程中逐渐减少参数。
在这种情况下,您的函数只需要一个参数。
您的论据elements
的类型为seq<'Key * 'T>
。这是两个泛型类型的元组序列:'Key'
和'T'
。
当我为此函数提供seq<'Key * 'T>
类型的内容时,它会告诉我它将返回Map<'Key,'T>
。这是一张地图,其中包含'Key
类型的键和类型为'T
的值。
最后你有一个类型约束when 'Key : comparison
这限制泛型类型'Key
是支持比较的东西,即实现IComparable
接口的类型。此类型约束是必需的,因为Map是使用二进制树实现的,该树使用比较作为其排序概念。