为什么没有> =>半群A => Scalaz的M [A]?

时间:2015-07-14 13:31:05

标签: scala scalaz kleisli semigroup

这是我之前的question

的后续内容

Kleisli定义了两个运算符<=<(compose)和>=>(andThen)。 >=>看起来很自然,我不明白<=<如何有用。

此外,>=>似乎没有A => M[A]半群,但<=<半群确实存在。

背后的理由是什么?

1 个答案:

答案 0 :(得分:7)

在无点和无点样式之间进行翻译时,

compose(或<=<)更自然一些。例如,如果我们有这些功能:

val f: Int => Int = _ + 1
val g: Int => Int = _ * 10

我们得到以下等价物:

scala> (f andThen g)(3) == g(f(3))
res0: Boolean = true

scala> (f compose g)(3) == f(g(3))
res1: Boolean = true

compose案例中,fg在等式两边的顺序相同。

不幸的是,Scala的类型推断通常会使andThen(或>=>}更方便,并且它的使用范围往往比compose更广泛。因此,这是一个数学约定和Scala类型推理系统的怪癖不一致的情况。 Scalaz(考虑到项目的文化,并不太令人惊讶)选择了数学方面。