簡體   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