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

Why is there no >=> semigroup for A => M[A] in Scalaz?

这是我之前

的后续

Kleisli 定义了两个运算符 <=<(组合)和 >=>(然后)。 >=> 对我来说看起来很自然,我不明白 <=< 有什么用。

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

背后的原理是什么?

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(考虑到项目的文化,这并不奇怪)选择了数学方面。