需要评论这个Map.ofSeq签名的含义

时间:2015-11-10 22:46:14

标签: f#

有人可以分析这种方法签名的含义吗?

/// 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#的新手,并且确实想要了解该语言的低级细节。

1 个答案:

答案 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是使用二进制树实现的,该树使用比较作为其排序概念。