[英]Difference between applicative and monadic computation in scala
鑒於這種簡單的計算,我無法清楚地看到使用適用於monadic風格的風格之間的區別。 那里有一些更好的例子(在scala中)什么時候使用一個而不是另一個。
println( (3.some |@| none[Int] |@| 4.some )( (a:Int,b:Int,c:Int) => { a + b + c } ) ) // prints None
println( for(
a <- Some(3);
b <- none[Int];
c <- Some(4)
) yield( a + b + c ) ) // prints None
兩個計算都以None結尾,因此最終結果是相同的。 我可以看到的唯一區別是,在使用應用語法時,在for comprehension中沒有temporaray訪問這些變量。
此外,具有一個None值會停止整個計算。 我認為應用意味着“不依賴於之前的計算結果”
應用程序構建器語法將評估每個術語, 並且不能使用先前計算的結果。 但是,即使第一個結果為None,仍將評估所有其他表達式。
然而,對於for comprehension,它將“快速失敗”(在你的情況下它不會在None之后評估任何進一步的表達式),而且你可以訪問先前計算的結果。
不要將這些東西視為簡單的不同風格 ,他們用不同的行為調用不同的函數:即flatMap vs apply
Monads表示順序計算,其中每個下一個計算依賴於先前的計算(如果先前的計算為空,則無法繼續,因此您“快速失敗”),更一般的monadic計算示例:
println( for(
a <- Some(1);
b <- Some(a);
c <- Some(a + b)
) yield( a + b + c ) ) //=> 4
應用只是類固醇的fmap
,不僅是一個參數,而且映射函數本身可以是空的。 在您的情況下,它可以重寫為:
4.some <*>
{ none[Int] <*>
{ 3.some <*>
{ (_: Int) + (_: Int) + (_: Int) }.curried.some } }
在某些步驟中,您的函數變為Option[Int => Int] = None
,但它不會停止將其應用於4.some
,只有結果為None
如預期的那樣。 你仍然需要知道4.some
的價值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.