gpt4 book ai didi

scala - 什么时候应该使用应用程序而不是单子(monad)?

转载 作者:行者123 更新时间:2023-12-03 20:26:22 25 4
gpt4 key购买 nike

我一直在工作中使用 Scala,为了更深入地理解函数式编程,我选择了 Graham Hutton 的 Programming in Haskell(喜欢它:)

在 Monads 一章中,我第一次看到了 Applicative Functors (AFs) 的概念

在我(有限的)专业 Scala 能力中,我从来没有使用过 AF,并且总是使用 Monads 编写代码。我试图提炼对“何时使用 AFs”的理解,从而提出这个问题。这种见解是否正确:

If all your computations are independent and parallelizable (i.e., the result of one doesn’t determine the output of another) your needs would be better served by an AF if the output needs to be piped to a pure function without effects. If however, you have even a single dependency AFs won’t help and you’ll be forced to use Monads. If the output needs to be piped to a function with effects (e.g., returning Maybe) you’ll need Monads.



例如,如果你有这样的“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 AFs 会更好地为您服务
  • 如果 f有效果,即 f(x,y): Option[Response]你需要 Monads
  • 如果 callServiceX(...), y <- callServiceY(...), callServiceZ(y)即,链中甚至有一个依赖项,使用 Monads。

  • 我的理解正确吗?我知道 AFs/Monads 还有很多,我相信我理解其中一个的优势(在大多数情况下)。我想知道的是决定在特定上下文中使用哪一个的决策过程。

    最佳答案

    这里没有真正要做出的决定:总是使用 Applicative 接口(interface),除非它太弱。1

    这是抽象强度的本质张力:更多的计算可以用 Monad 表达;用 Applicative 表示的计算可以以更多方式使用。

    对于需要使用 Monad 的条件,您似乎大多是正确的。我不确定这个:

    • If f has effects i.e. f(x,y) : Option[Response] you'll need Monads.


    不必要。这里讨论的仿函数是什么?没有什么能阻止您创建 F[Option[X]]如果 F是应用程序。但就像以前一样,您将无法在 F 中做出进一步的决定。取决于 Option成功与否—— F 的整个“调用树” Action 必须是可知的,无需计算任何值。

    1 除了可读性问题之外,就是这样。由于其命令式的外观,Monadic 代码可能更容易被传统背景的人所接受。

    关于scala - 什么时候应该使用应用程序而不是单子(monad)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60498712/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com