在Scala类型参数中, - >>和 - >>>是什么意思?

jxs*_*ord 8 scala

Heiko Seeberger在这里写了一篇关于类别理论的精彩博文:

https://hseeberger.wordpress.com/2010/11/25/introduction-to-category-theory-in-scala/

在其中,他定义了一个GenericFunctor,如下所示:

trait GenericFunctor[->>[_, _], ->>>[_, _], F[_]] {
  def fmap[A, B](f: A ->> B): F[A] ->>> F[B]
}
Run Code Online (Sandbox Code Playgroud)

我没有运气找到文档中对 - >>和 - >>>符号的文档引用.有人可以解释一下他们在做什么吗?

Eug*_*ota 14

符号本身并不意味着什么.他们是Heiko挑选的任意名字:

> class Foo[A, B]
defined class Foo

> class Foo[M1[_], M2[_]]
defined class Foo

> class GenericFunctor[->>[_, _], ->>>[_, _], F[_]]
defined class GenericFunctor
Run Code Online (Sandbox Code Playgroud)

它们是类型参数的一部分,它们本身就是类型构造函数(如果你想要听起来很花哨,那就是更高级的类型).类型应用程序可以写成中缀,因此A ->> B也是如此->>[A, B].

根据正在发生的事情...... Heiko说

看看这些成分,我们找到了我们需要的所有东西:类型AB映射到类型F[A],F[B]并且映射A ->> B映射到地图F[A] ->>> F[B].

由于我们在讨论类别理论,我们希望避免使用术语函数,因为这是特定于实现的,但我们想要描述某种类似函数的东西.他们的行话中的某种功能是箭头.我们需要其中两个,因为我们不想假设传入和传出箭头是相同的.这两个箭头用->>和表示->>>.F[_]是一个像List和的容器Option.我认为..

因此fmap(map在Scala中也称为方法)获取值的箭头并返回另一个容器箭头.除了map方法之外,fmap返回一个带容器的箭头.

两个箭头的GenericFunctor使用的具体应用FunctionFunctor.和特定的应用Functor,使用List的容器ListFunctor.

object ListFunctor extends Functor[List] {
  def fmap[A, B](f: A => B): List[A] => List[B] = as => as map f
}
Run Code Online (Sandbox Code Playgroud)

所以这是采取了从功能AB,并从返回一个函数List[A]List[B],调用map内部.


Lui*_*hys 5

一个线索是它们在特征定义的方括号内:它们只是博客作者选择的任意符号,就像[T]通常用于泛型类,特征和方法一样.这些恰好是更高级的类型(即带参数的参数).

选择箭头般的名称是因为,正如他所说,

"A - >> B只是另一种写作方式 - >> [A,B],很好地反映了我们在这里讨论地图的事实."