这是我之前的question
的后续内容 Kleisli
定义了两个运算符<=<
(compose)和>=>
(andThen)。 >=>
看起来很自然,我不明白<=<
如何有用。
此外,>=>
似乎没有A => M[A]
半群,但<=<
半群确实存在。
背后的理由是什么?
答案 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
案例中,f
和g
在等式两边的顺序相同。
不幸的是,Scala的类型推断通常会使andThen
(或>=>
}更方便,并且它的使用范围往往比compose
更广泛。因此,这是一个数学约定和Scala类型推理系统的怪癖不一致的情况。 Scalaz(考虑到项目的文化,并不太令人惊讶)选择了数学方面。