簡體   English   中英

scala中的applicative和monadic計算之間的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM