更新时间:2022-11-23 09:23:46
那么为什么还要用到应用函子呢?有单子吗?
首先,为
提供monad实例根本不可能,我们想要使用的一些抽象 -Validation
是$ b $一个完美的例子。
第二个(也是相关的),使用
最强大的抽象将完成工作只是一个可靠的开发实践。在
原则中,这可能会使优化不会成为
的可能,但更重要的是,它使得我们编写的代码更多
可重用。
在第一段中扩展一下:有时你在单向代码和应用代码之间没有选择。请参阅回答的其余部分,了解您为什么要使用Scalaz的验证
(它不能也没有monad实例)来建模
验证。
关于优化点:它会可能会有一段时间,这通常与Scala或Scalaz有关,但请参阅 Haskell的 Data.Binary
的文档:
应用风格有时会导致代码更快,因为
binary
会尝试通过将读取组合在一起来优化代码。
编写应用程序代码可以避免对计算之间的依赖关系做出不必要的声明 - 声称类似的一元代码会提交给您。一个足够智能的库或编译器可以原则上利用这一事实。
为了让这个想法更具体一些,请考虑以下monadic代码: case class Foo(s:Symbol,n:Int)
val maybeFoo = for {
s< - maybeComputeS(无论)
n< - maybeComputeN(无论)
}产生Foo(s,n)
$ c> -comprehension的解析为如下所示的内容:
val maybeFoo = maybeComputeS(whatever).flatMap(
s => maybeComputeN(whatever).map(n => Foo(s,n))
)