Scala Rank-1多态性

spa*_*rkr 3 scala

以下代码片段来自twitter的Scala学校:

Scala具有一级多态性.粗略地说,这意味着您希望在Scala中表达一些类型概念,这些概念对于编译器而言"过于通用".假设你有一些功能:

def toList[A](a: A) = List(a)
Run Code Online (Sandbox Code Playgroud)

您希望一般使用:

def foo[A, B](f: A => List[A], b: B) = f(b)
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为必须在调用站点修复所有类型变量.即使你"钉"式B,

def foo[A](f: A => List[A], i: Int) = f(i) // Line 1
Run Code Online (Sandbox Code Playgroud)

...你得到一个类型不匹配.

为什么Line 1会失败?B的类型是已知的.为什么编译失败?

M.K*_*.K. 5

scala> def toList[A](a:A) = List(a)
toList: [A](a: A)List[A]

scala> def foo[A, B](f: A => List[A], b: B) = f(b)
<console>:10: error: type mismatch;
 found   : b.type (with underlying type B)
 required: A
       def foo[A, B](f: A => List[A], b: B) = f(b)
Run Code Online (Sandbox Code Playgroud)

此行不会编译,因为B当函数需要type值时,您传递的是type 值A.

def foo[A](f: A => List[A], i: Int) = f(i) // Line 1
Run Code Online (Sandbox Code Playgroud)

对于此行,您需要提供从类型Int到类型的隐式转换A.