4

这是我上一个问题的后续

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

此外,看起来没有>=>半群,A => M[A]<=<半群确实存在。

其背后的原理是什么?

4

1 回答 1

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

于 2015-07-14T15:40:16.913 回答