类型参数minBy [B](f:((A,B))⇒B)(隐式cmp:订购[B]):( A,B)

时间:2011-12-06 09:28:14

标签: scala type-parameter

特征Map[A,+B]有一个方法

def minBy [B] (f: ((A, B)) ⇒ B)(implicit cmp: Ordering[B]): (A, B)

我期望特征的B与方法中的特征相同,但我仍然无法理解这一点:

val m2 = Map('a -> "1", 'b ->"2" ,'c ->"3")
m2.minBy((t:(Symbol,String))=>Integer.parseInt(t._2))

此处B的{​​{1}}为Map[A,+B]String的{​​{1}}为B - 或者我错了?

所以我希望方法的类型相当

minBy

但这不是消息来源所说的。

如果两者截然不同,我应该知道哪里? 如果他们不是 - 你能发现并指出我的错误吗?

2 个答案:

答案 0 :(得分:7)

构建文档的软件似乎无法从特征的B定义重命名minBy变量,从而导致名称冲突。你的分析似乎是对的。

要使用lambda演算中的术语,我会说该软件未能alpha-convert

答案 1 :(得分:6)

您的分析是正确的,应该将其重命名为C或其他内容。问题是scaladoc只是用一个元组(A,B)替换TraversableLike定义中的A,因为它是一个映射。这是TraversableLike的定义:

def minBy [B] (f: (A) ⇒ B)(implicit cmp: Ordering[B]): A

因为它是一张地图,scaladoc用元组(A,B)替换(A)。

def minBy [B] (f: (A, B) ⇒ B)(implicit cmp: Ordering[B]): (A, B)

如你所见,实际上并不是正确的签名。

这是一个已知问题,scaladoc does not disambiguate between same-named type parameters。投票或提交补丁!