scala中的applicative和monadic计算之间的区别

Jay*_*Jay 3 scala scalaz applicative

鉴于这种简单的计算,我无法清楚地看到使用适用于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
Run Code Online (Sandbox Code Playgroud)

两个计算都以None结尾,因此最终结果是相同的.我可以看到的唯一区别是,在使用应用语法时,在for comprehension中没有temporaray访问这些变量.

此外,具有一个None值会停止整个计算.我认为应用意味着"不依赖于之前的计算结果"

mel*_*lps 5

应用程序构建器语法将评估每个术语,并且不能使用先前计算的结果.但是,即使第一个结果为None,仍将评估所有其他表达式.

然而,对于for comprehension,它将"快速失败"(在你的情况下它不会在None之后评估任何进一步的表达式),而且你可以访问先前计算的结果.

不要将这些东西视为简单的不同风格,他们用不同的行为调用不同的函数:即flatMap vs apply