[我一直在使用Scala,为了更深入地了解函数式编程,我选择了Hashamell的Graham Hutton的编程(喜欢它:]
在有关Monads的章节中,我首次了解了应用函子(AFs)的概念
以我(有限)的专业级身份,我从不需要使用自动对焦,并且始终编写使用Monad的代码。我试图提炼出对“何时使用自动对焦”的理解,以及由此带来的问题。这个见解正确吗:
如果您的所有计算都是独立且可并行的(即,一个运算的结果不能确定另一个运算的输出),则需要将AF传递给纯函数而没有效果时,AF可以更好地满足您的需求。但是,如果您甚至有single依赖AF,也将无济于事,并且将force使用Monad。如果需要将输出通过管道传递给具有效果的函数(例如,返回Maybe),则需要Monad。
例如,如果您有“ monadic”代码,例如:
val result = for {
x <- callServiceX(...)
y <- callServiceY(...) //not dependent on X
} yield f(x,y)
最好执行类似的操作(用于scala的伪AF语法,其中|@|
就像是并行/异步调用之间的分隔符。
val result = (callServiceX(...) |@| callServiceY(...)).f(_,_)
f == pure and callService* are independent
AF可以更好地为您服务f
具有效果,即f(x,y): Option[Response]
,则需要Monads]>callServiceX(...), y <- callServiceY(...), callServiceZ(y)
,即链中甚至只有一个依赖项,请使用Monads。我的理解正确吗?我知道自动对焦/单声道相机还有很多其他功能,而且我相信我(多数情况下)了解一种相对于另一种的优势。我想知道的是在特定情况下决定使用哪个的决策过程。
[我一直在使用Scala并更深入地了解函数式编程,所以我选择了Hashamell中的Graham Hutton的编程(喜欢它:)。在有关Monads的章节中,我对...有了初步了解。
这里并没有真正的决定:除非太弱,请始终使用Applicative接口。1