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

Mic*_*ael 4 scala scalaz kleisli semigroup

这是我上一个问题的后续内容

Kleisli定义了两个运算符<=<(compose)和>=>(andThen).在>=>找我很自然的,我不明白怎么<=<会很有用.

而且,看起来没有>=>半群,A => M[A]但是<=<半群确实存在.

它背后的理由是什么?

Tra*_*own 7

compose(或<=<)在无点和无点样式之间进行翻译时更自然一些.例如,如果我们有这些功能:

val f: Int => Int = _ + 1
val g: Int => Int = _ * 10
Run Code Online (Sandbox Code Playgroud)

我们得到以下等价物:

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

scala> (f compose g)(3) == f(g(3))
res1: Boolean = true
Run Code Online (Sandbox Code Playgroud)

compose情况下,fg在等式两边的顺序相同.

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