[英]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
情況下, f
和g
在等式的兩邊具有相同的順序。
不幸的是,Scala的類型推斷經常使得andThen
(或>=>
)更方便,並且它往往比compose
更廣泛地使用。 因此,這是一個數學約定和Scala類型推理系統的怪癖不一致的情況。 Scalaz(考慮到項目的文化,並不太令人驚訝)選擇了數學方面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.