问题标签 [state-monad]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1053 浏览

haskell - State 和其他 MTL monad 的应用实例?

查看 的文档Control.Applicative,我注意到它们具有某些 monad 的实例声明(例如IOMaybe尤其是ST),但没有 MTL monad 的实例,例如Stateand RWS。相反,它看起来像定义了一个通用WrappedMonad类型,我猜它是为了涵盖所有其他情况。

所以这是我的问题:

  1. 为什么没有ApplicativeMTL monad 的实例?到目前为止,我自己能找到的最佳答案是一个三年前的帖子,其中有人实施了这些实例,但被立即忽略了。

  2. 有什么关系WrappedMonad?我在 Reddit 上找到了一篇简要解释它的帖子,但我想我对如何使用它感到困惑。

最终,我希望能够以State应用风格使用(正如向我推荐的那样),但如果我不得不用WrappedMonad数据构造函数乱扔代码,那么这似乎不是一场胜利。我也可以完全忽略,并以与 相同的方式自己WrappedMonad定义实例,依此类推:就and ... 而言,但这似乎也很愚蠢。ApplicativeIOSTreturnap

0 投票
1 回答
1875 浏览

haskell - 为什么简单地使用 State monad 会导致堆栈溢出?

我在玩 State monad,我不知道是什么导致了这段简单的代码中的堆栈溢出。

注意 我只想知道是什么导致了这段代码的问题,任务本身并不重要。

0 投票
3 回答
236 浏览

haskell - 如何在两个 monad 之间共享状态?

我被以下单子问题困扰:

假设我有一个标准的单子状态,状态为 S = (LS, RS)。我还有另一个单子:

我想使用 StateP 执行一些计算,然后将状态与 State monad 中的状态合并:

它不起作用,但我不明白为什么?有没有另一种方法来实现这样的功能?

0 投票
2 回答
988 浏览

scala - 试图理解 scalaz state monad

我正在尝试在我的电梯项目中开始使用 scalaz。为此,我正在重写一些代码来满足这种风格。考虑一个用于登录用户的代码:

所以,这应该以某种方式使用状态单子重写。但我就是不明白,如何。试试这个:

UPD:根据答案更新了示例。

关于scalaz中状态单子的任何好的教程/解释,展示如何使用getsput等?

0 投票
2 回答
517 浏览

haskell - haskell 中不同的、交互的状态级别

我正在模拟一个 4 位微处理器。我需要跟踪寄存器、内存和运行输出(还有一个获取执行周期计数器的奖励点)。我已经设法在没有单子的情况下做到了这一点,但是一次明确地传递这么多东西感觉很混乱。此外,函数定义混乱、冗长且难以阅读。

我试图用 monads 做到这一点,但它不适合在一起。我尝试将所有单独的状态组件视为单一类型,但这给我留下了如何创建值的问题。

是唯一有意义的类型。但在这一点上,为什么还要打扰呢?我尝试通过将字符串从复合类型中拉出并将其视为值来分解它

效果很好,除了我需要 RUNNING 输出。无论我做什么,我都无法同时抓住字符串和状态。

现在我正在努力解决单子变压器。似乎我必须分离出所有不同级别的状态。但我的头快要爆炸了。

我什至还没有放入 FEcycle 计数器呢!

问题:

  1. 我在正确的轨道上吗?
  2. 看到我现在正在拔出单子变压器,是否可以停止将“运行输出”视为状态并将其交给 IO 单子?那太棒了,我可以打印它,而不是坚持它。
  3. 我应该将状态分为多少层?我可以看到两个不同的层,但它们彼此密切相关(内存和寄存器都取决于内存和寄存器的状态)。我应该将它们作为一个单一的状态保持在一起还是将它们分开并堆叠起来?哪种方法会产生最易读的代码?
0 投票
2 回答
969 浏览

haskell - 管理状态 - SICP 第 3 章

我一直在研究计算机程序的结构和解释,并在 Haskell 中完成练习。前两章很好(github 上的代码),但第 3 章让我更加努力地思考。

首先讨论管理状态,以银行账户为例。他们定义了一个make-withdraw函数

这样您就可以执行以下代码:

我不确定如何在 Haskell 中模拟这一点。我首先想到了一个使用 State monad 的简单函数:

这允许我运行代码

但这与方案代码有所不同。理想情况下,我可以运行类似的东西

但我不确定如何编写函数makeWithdraw。有什么建议吗?

0 投票
2 回答
876 浏览

arrays - 使用 STArray 的 Haskell 并行计算

我正在尝试并行计算,并将结果写入 STArray。我认为这段代码显示了我正在尝试做的事情。但是,我遇到了编译错误。

我该怎么做?

0 投票
4 回答
4403 浏览

haskell - 对“Learn you a Haskell”的 State Monad 代码感到困惑

我正在尝试使用在线书籍Learn you a Haskell for great Good来掌握 Haskell 。

据我所知,到目前为止,我已经能够理解 Monad,直到我读到介绍State Monad的章节。

然而,呈现并声称是 State 类型的 Monad 实现的代码(我无法在 Hoogle 中找到它)似乎对我来说太难处理了。

  • 首先,我不明白它背后的逻辑,即为什么它应该起作用以及作者如何考虑这种技术。(也许可以建议相关文章或白皮书?)

  • 在第 4 行,建议函数 f 采用 1 个参数。
    然而,接下来的几行我们看到了 pop,它不带参数!

  • 为了扩展第 1 点,作者试图用一个函数来代表国家来完成什么。

非常感谢任何有助于理解正在发生的事情。

编辑

敬启者,

下面的答案彻底涵盖了我的问题。
不过我想补充一件事:

在阅读了下面建议的文章后,我找到了上面第二点的答案:一直以来,我都认为pop 函数会像这样使用:
stuff >>= pop因为在绑定类型中,第二个参数是函数,而正确的用法是 this pop >>= stuff,在再次阅读 do-notation 如何转换为普通的 bind-lambdas 后,我意识到这一点。

0 投票
3 回答
3250 浏览

haskell - 在 Haskell 中组合 monad

我正在尝试编写一个蜘蛛纸牌播放器作为 Haskell 学习练习。

我的函数将为每个游戏main调用一次函数(使用),传入游戏编号和随机生成器()。该函数应该返回一个monad 和一个 IO monad,其中包含一个显示游戏画面和一个指示游戏是赢还是输的信息。playGamemapMStdGenplayGameControl.Monad.StateStringBool

如何将Statemonad 与IOmonad 结合起来作为返回值?`playGame 的类型声明应该是什么?

State IO (String, Bool)正确的吗?如果不是,应该是什么?

main,我打算使用

这是正确的调用方式playGame吗?

0 投票
1 回答
183 浏览

compiler-optimization - SSA 中的副作用跟踪

我正在研究 Java 字节码的优化器,并决定使用 SSA。然而,大多数优化要求所有操作都是纯函数式的,因此为了处理副作用,我决定为每个可能产生副作用的操作添加一个额外的不透明状态参数和返回值。这将防止优化或重新排序具有副作用的操作。例如,忽略异常处理,你会得到类似这个伪代码的东西。

我在做什么有名字吗?这是一个好方法吗?听说函数式语言有一个概念叫Monads,听上去很像但又不一样。使用单子是更好的方法吗?如果是这样,我该如何修改它以使用单子?