【发布时间】:2018-06-11 09:56:01
【问题描述】:
我正在阅读有关 Scala 中更高种类的类型的信息,但我无法理解下划线的使用。
例如:
trait Functor[F[_]] {
def map[A, B](fa: F[A])(f: A => B) : F[B]
}
val listFunctor = new Functor[List] {
override def map[A, B](fa: List[A])(f: A => B) = fa.map(f)
}
listFunctor.map(List(1,2,3))(_ + 3)
如果我在特征中使用参数化类型 A,我会得到相同的结果:
trait Functor2[F[A]] {
def map[A, B](fa: F[A])(f: A => B) : F[B]
}
val listFunctor2 = new Functor2[List] {
override def map[A, B](fa: List[A])(f: A => B) = fa.map(f)
}
listFunctor2.map(List(1,2,3))(_ + 3)
这两个例子有显着差异吗?
【问题讨论】:
-
在您的第二个示例中,您的
A来自map[A, B]。F[A]中定义的一个是不同的。它只是一个占位符。并且不能在签名之外使用。通常,更高种类的类型只是将另一种类型作为参数的类型。语法并不那么重要。