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

时间:2012-01-29 01:13:03

标签: 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]
}

我没有找到文件参考 - >>和 - >>>文档中的符号。有人可以解释一下他们在做什么吗?

3 个答案:

答案 0 :(得分:14)

符号本身并不意味着什么。他们是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说

  

查看这些成分,我们找到了我们需要的所有内容:类型AB映射到类型F[A]F[B]以及地图A ->> B是映射到地图F[A] ->>> F[B]

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

所以fmap(Scala中的又名map方法)获取值的箭头并返回另一个容器箭头。除了map方法之外,fmap会返回一个带容器的箭头。

GenericFunctor使用Function对两个箭头的具体应用是Functor。对容器使用Functor的{​​{1}}的具体应用是List

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]

答案 1 :(得分:5)

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

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

  

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

答案 2 :(得分:1)

my answer to a duplicate question on request复制的答案:

它是higher-kinded type,在this introductionresearch paper中很好地描述了。

您可能会觉得令人困惑的原因是->>是较高知名度类型的名称 - 它可能也被称为Arrow