2011-12-06 50 views
10

的性状Map[A,+B]有一个方法类型参数(F:((A,B))⇒B)(隐式CMP:订货[B]):(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)) 

这里,Map[A,+B]BString,但minByBInt - 或者我错了?

所以我预计方法的类型是相当

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

但那不是源说。

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

回答

6

你的分析是正确的,它应该重新命名为C或其他。问题在于scaladoc只是用Tuple(A,B)替换TraversableLike中的A,因为它是一张地图。这是从TraversableLike的定义是:一个元组(A,B)

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

,因为它是一个地图,scaladoc替换(A)。

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

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

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

+0

啊,好的,我对这个消息的评论是错误的。 minBy方法在GenTraversableOnce中声明,然后在TraversableOnce中定义 - 并且都不知道B.因此它确实是一个scaladoc问题。谢谢你们俩。 – Theodosius

7

似乎构建文档的软件似乎没有将B变量重命名为minBy的特征定义,从而导致名称冲突。你的分析看起来正确。

要使用lambda微积分的术语,我会说软件未能alpha-convert

相关问题