繁体   English   中英

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

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

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

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

此外,看起来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(考虑到项目的文化,并不太令人惊讶)选择了数学方面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM