我正在阅读有关 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)
这两个例子之间有显着差异吗?
最佳答案
这两种表达 Functor2
的方式没有区别。通过类型构造函数参数化。如果您注意到,在后一种情况下,A
只是一个占位符,因为它尚未在其他地方声明。
我一般更喜欢使用 F[_]
语法,因为它阐明了我们需要一个类型构造函数,并且在类中引用的占位符和类型之间的命名不会意外重叠:在后一种情况下,即使它们碰巧引用相同的类型参数,也没有A
之间的强制约束在构造函数签名和 A
在 map
方法签名,这也可能导致对两个 A
的性质的一些混淆以及它们是如何相互关联的。
关于scala - 高级类型与泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50794985/