一个人何时应该在单子上使用止痛药?

问题描述 投票:2回答:1

[我一直在使用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的章节中,我对...有了初步了解。

scala haskell monads applicative
1个回答
0
投票

这里并没有真正的决定:除非太弱,请始终使用Applicative接口。1

© www.soinside.com 2019 - 2024. All rights reserved.