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]
}
我没有找到文件参考 - >>和 - >>>文档中的符号。有人可以解释一下他们在做什么吗?
答案 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说
查看这些成分,我们找到了我们需要的所有内容:类型
A
和B
映射到类型F[A]
和F[B]
以及地图A ->> B
是映射到地图F[A] ->>> F[B]
。
由于我们正在讨论类别理论,我们希望避免使用术语函数,因为这是特定于实现的,但我们想要描述某种类似于函数的东西。他们的行话中的某种功能是箭头。我们需要其中两个,因为我们不想假设传入和传出箭头是相同的。这两个箭头由->>
和->>>
表示。 F[_]
是一个像List
和Option
这样的容器。我想..
所以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 introduction和research paper中很好地描述了。
您可能会觉得令人困惑的原因是->>
是较高知名度类型的名称 - 它可能也被称为Arrow
。