为什么 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
的情况下,f
和g
在等式两边的顺序相同。
不幸的是,Scala 的类型推断常常使andThen
(或>=>
)更加方便,而且它的使用往往比compose
更广泛。所以在这种情况下,数学约定和 Scala 类型推断系统的怪癖是不一致的。 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
的情况下,f
和g
在等式两边的顺序相同。
不幸的是,Scala 的类型推断常常使andThen
(或>=>
)更加方便,而且它的使用往往比compose
更广泛。所以在这种情况下,数学约定和 Scala 类型推断系统的怪癖是不一致的。 Scalaz(考虑到项目的文化,这并不奇怪)选择了数学方面。