符号本身没有任何意义。它们是 Heiko 选择的任意名称:
> class Foo[A, B]
defined class Foo
> class Foo[M1[_], M2[_]]
defined class Foo
> class GenericFunctor[->>[_, _], ->>>[_, _], F[_]]
defined class GenericFunctor
它们是类型参数的一部分,它们本身就是类型构造函数(如果你想听上去花哨的话,是更高级的类型)。
类型应用程序可以写成中缀,所以A ->> B和->>[A, B]是一样的。
根据正在发生的事情...... Heiko说
查看成分,我们找到了所有我们需要的东西:类型 A 和 B 映射到类型 F[A] 和 F[B] 并且映射 A ->> B 映射到映射 F[A] ->>> F[B]。
由于我们在谈论类别理论,我们希望避免使用术语函数,因为它是特定于实现的,但我们希望描述某种类似于函数的东西。在他们的术语中,类似功能的东西是箭头。我们需要其中两个,因为我们不想假设传入和传出箭头相同。这两个箭头由->> 和->>> 表示。 F[_] 是像 List 和 Option 这样的容器。我觉得..
所以fmap(Scala 中又名map 方法)接受一个值箭头并返回另一个容器箭头。除了与map 方法不同,fmap 返回一个带有容器的箭头。
GenericFunctor 对两个箭头使用Function 的具体应用是Functor。而使用List作为容器的Functor的具体应用是ListFunctor。
object ListFunctor extends Functor[List] {
def fmap[A, B](f: A => B): List[A] => List[B] = as => as map f
}
这就是从A 到B 的函数,并从List[A] 到List[B] 返回一个函数,在内部调用map。