gpt4 book ai didi

functional-programming - 状态单子(monad)的目的是什么?

转载 作者:行者123 更新时间:2023-12-04 00:54:17 25 4
gpt4 key购买 nike

我是一名 JavaScript 开发人员,正在提升我的函数式编程技能。我最近在管理状态方面遇到了困难。在寻找解决方案时,我在各种文章和视频中偶然发现了 state monad,但我很难理解它。我想知道是不是因为我希望它不是。

我试图解决的问题

在 Web 客户端中,我从后端获取资源。为了避免不必要的流量,我在客户端创建了一个简单的缓存,其中包含已经获取的数据。缓存是我的状态。我希望我的几个模块能够保存对缓存的引用并查询它的当前状态,该状态可能已被另一个模块修改。

这在 javascript 中当然不是问题,因为可以改变状态,但我想了解更多关于函数式编程的知识,我希望 state monad 能帮助我。

我的期望

我曾假设我可以做这样的事情:

var state = State.of(1);
map(add(1), state);
state.evalState() // => 2

这显然是行不通的。状态始终为 1。

我的问题

我对 state monad 的假设是错误的,还是我只是错误地使用它?

我意识到我可以做到这一点:
var state = State.of(1);
var newState = map(add(1), state);

...和 newState将是状态 2。但是在这里我并没有真正看到 state monad 的使用,因为我必须创建一个新实例才能改变值。在我看来,这似乎是值不可变的函数式编程中总是做的事情。

最佳答案

state monad 的目的是隐藏函数之间的状态传递。

举个例子:

方法 A 和 B 需要使用一些状态并对其进行变异,而 B 需要使用 A 变异的状态。在具有不可变数据的函数式语言中,这是不可能的。

取而代之的是:将初始状态连同它需要的参数一起传递给 A,然后 A 返回一个结果和一个“修改后的”状态——实际上是一个新值,因为原始状态没有改变。这个"new"状态(也可能是结果)被传递给 B 及其所需的参数,然后 B 返回它的结果和它(可能已经)修改的状态。

显式地传递这个状态是一个 PITA,所以 State monad 将它隐藏在它的 monadic 覆盖下,允许需要访问状态的方法通过 get 获得它和 set单子(monad)方法。

为了使用状态计算 A 和 B,我们将它们组合成一个聚合状态计算,并为该聚合提供一个开始状态(和参数)以运行,它返回最终“修改”状态和结果(通过 A ,B,以及它由什么组成的)。

根据您的描述,在我看来,您正在寻找更多类似于 actor model of concurrency 的内容。 ,其中状态在参与者中管理,其余代码通过它与它交互,检索它(的非可变版本)或告诉它通过消息进行修改。在不可变语言(如 Erlang)中,actor 阻塞等待消息,然后在收到消息时处理它,然后通过(尾)递归循环;他们将任何修改后的状态传递给递归调用,这就是状态被“修改”的方式。

不过,正如您所说,由于您使用的是 JavaScript,所以这不是什么大问题。

关于functional-programming - 状态单子(monad)的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28224270/

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