scala - 高级类型与泛型

标签 scala higher-kinded-types

我正在阅读有关 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 之间的强制约束在构造函数签名和 Amap方法签名,这也可能导致对两个 A 的性质的一些混淆以及它们是如何相互关联的。

关于scala - 高级类型与泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50794985/

相关文章:

multithreading - 嵌套 future 导致更差的性能

scala - 在 Scala 中是否可以指定匿名函数的返回类型?

scala - 测试是否在不提供参数的情况下调用了方法

scala - 使用 Akka Streams 读取大文件

Java Generic获取类型参数

haskell - 在 Haskell 中, "higher-kinded types"*真的*类型吗?或者它们仅仅表示*具体*类型的集合而仅此而已?

scala - scala中高阶多态性的常见做法

scala - Scala中的隐式抽象类构造函数参数和继承

haskell - 在存在类型运算符的情况下实现嵌套/递归数据类型

c# - C# 中的 Monad 变形金刚