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

The*_*ius 10 scala type-parameter

特质Map[A,+B]有一种方法

def minBy [B] (f: ((A, B)) ? B)(implicit cmp: Ordering[B]): (A, B)
Run Code Online (Sandbox Code Playgroud)

我期望B特性与方法中的特性相同,但后来我仍然无法理解:

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

这里B的Map[A,+B]就是String,不过B的minBy就是Int-或犯错吗?

所以我期望该方法的类型是相当的

def minBy [C] (f: ((A, B)) ? C)(implicit cmp: Ordering[C]): (A, B)
Run Code Online (Sandbox Code Playgroud)

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

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

dhg*_*dhg 7

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

要使用lambda演算中的术语,我会说软件无法进行alpha转换.


Mat*_*ell 6

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

def minBy [B] (f: (A) ? B)(implicit cmp: Ordering[B]): A
Run Code Online (Sandbox Code Playgroud)

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

def minBy [B] (f: (A, B) ? B)(implicit cmp: Ordering[B]): (A, B)
Run Code Online (Sandbox Code Playgroud)

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

这是一个已知问题,scaladoc不会消除同名类型参数之间的歧义.投票或提交补丁!