为什么Functor是一个更高级的类型

Tom*_*Tom 4 scala category-theory

我有以下仿函数定义

trait Functor[F[_]] { 
    def map[A, B](fa: F[A])(f: A => B): F[B]
}
object ListFunctor extends Functor[List] { //
    def map[A, B](f: A => B)(data: List[A]): List[B] = data map f
}
Run Code Online (Sandbox Code Playgroud)

在scala中,很常见的F是集合类型,例如List,Seq,Option,我会问为什么Functor必须是更高级的类型,类型参数F究竟是什么意思?

Yuv*_*kov 6

为什么Functor必须是更高级的kinded类型

Functor必须得到更高的kinded,因为我们想要抽象一个类型参数,它本身采用一个类型参数(我们称之为类型构造函数,Functor[List]作为一个具体的例子).

处理的类型类型Functor称为"一阶种类",它们的种类是* -> *.当您查看具体实例时Functor,您会看到我们不提供内部类型参数.例如,当您在示例中定义仿函数时List,将其定义为Functor[List].我们不是为正确的类型(即List[Int])创建一个仿函数,而是为了包含在其中的任何类型List.这种抽象带来了巨大的力量,因为你可以利用它为任何适当的List类型(一种*),无论是List[String],List[Int]等.

我总是喜欢参考Adriaan Moore在他的论文"更高级的Genrics"中绘制的图像:

更高的种类

类型参数F的真正含义是什么?

F唯一的目的是与实施者订立合同Functor.通过签名F我们可以推断出什么样的类型Functor期望.当我们看到它有一个"占位符"([_])时,按惯例,我们知道这意味着F应该采用单个类型参数.如果我们想想都觉得需要一个单一的类型参数的类型,我们可以看到,有很多,例如List,Option,Try,Future,Task,等.

有关更高级别的kinded类型的更广泛的解释,请参阅Scala中什么是更高级的类型?