问题标签 [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 投票
4 回答
1632 浏览

haskell - 具有多个状态值的状态单子

考虑以下:

我希望这会导致23. 有没有办法在纯 Haskell 中实现这样的东西,如果是这样,怎么做?我明白STRef会做这样的事情,但我只想用普通的 Haskell 来做(目前不担心效率)。我想我必须创建一个数据类型并使其成为 的实例Monad,但我不确定细节,所以一个工作示例会很有帮助。

0 投票
2 回答
1847 浏览

scala - 用于理解的 Scala 状态单子

我在这里学习迈克尔·皮尔奎斯特(Michael Pilquist)的优秀状态单子讲座。我在 54 分钟时遇到了两个问题。

  1. 如果ofsOption[FollowerStats],那么?运算符是什么?我在 Scala 2.10.2 中的 Option 上找不到三元运算符

  2. 最后一个生成器如何将更新的缓存(增加命中或未命中)放回StatecheckCache 方法的结果中?返回的State似乎被丢弃了,而 for 理解似乎只产生了Option[FollowerStats]

.

为了尝试理解,我尝试重新编写 for理解,但这没有帮助。

更新: 由于答案,我想我已经掌握了第 2 点的关键。我没有意识到 yield 本质上是在说:从 中获取最后一个状态s => (s,())并用 ofsput替换Unit值类型,以获取s =>(s,ofs). 我想关键是要意识到收益并不是字面上的返回,而是被翻译为 State.map。

更新 现在了解选项位。我猜这个演示文稿仍然使用了 Scalaz 的隐式,尽管它派生了 state monad。

0 投票
0 回答
674 浏览

haskell - 带引用的 Haskell 数据类型

我正在实现 Ukkonen 的算法,它要求树的所有叶子都包含对同一整数的引用,我在 Haskell 中这样做以了解有关该语言的更多信息。但是,我很难写出执行此操作的数据类型。

如何将引用放在Leaf类型声明中?

0 投票
1 回答
1083 浏览

haskell - Haskell MonadState 实现 put 和 modify

我想用 modify 来实现 put

当我做

我收到错误,
预期类型:m()
实际类型:m((),s)
我尝试过这样的事情

获得预期的类型 m()
但此解决方案不起作用

有人可以向我解释如何使用 modify 来实现 put 吗?
感谢您的时间和帮助。

0 投票
1 回答
332 浏览

haskell - 带有谓词的状态单子

我正在尝试创建一些看起来很像 State monad 的东西,但也带有一个谓词列表和伴随状态的转换函数。我设想的计算的基本步骤如下:

Foo (state, [(pred, t)]) >>= f. 适用fs,屈服s'。然后将每个谓词应用于s'. 对于每个匹配的谓词,依次将关联的转换函数应用于状态。例如假设[(p1, t1), (p2, t2), (p3, t3)],fs。如果在f syield之后s'p1 s'并且p3 s'两者都 return True,您将执行t1 s'yielding s'',然后执行t3 s''yielding s''',即计算结果。

这里有很多活动部件,我觉得正确的方法是在 StateT 变压器或 State monad 之上构建它,但我不知道从哪里开始。

我觉得这好像不是很清楚。非常感谢任何能使这一点更清楚的澄清。

0 投票
0 回答
169 浏览

clojure - clojure.algo.monad 使用 parser-m 的奇怪 m-plus 行为 - 为什么要评估第二个 m-plus?

我在写的一些单子中出现了意想不到的行为。我创建了一个 parser-m monad

这几乎是到处给出的例子(这里这里这里

我使用 m-plus 作为一种贯穿查询机制,在我的例子中,它首先从缓存(数据库)中读取值,如果返回 nil,下一个方法是从“live”中读取( REST 调用)。

但是,总是调用 m-plus 列表中的第二个值,即使它的值被忽略(如果缓存命中良好)并且最终返回的是第一个单子函数的值。

这是我看到的问题的简化版本,以及我找到的一些解决方案,但我不知道为什么。

我的问题是:

  1. 这是预期的行为还是 m-plus 中的错误?即,即使第一项返回值,m-plus 列表中的第二个方法是否总是被评估?
  2. 与上述相比较小,但如果我 _ (fetch-state)从检查器中删除调用,当我评估该方法时,它会打印出 m-plus 正在调用的函数的消息(当我认为它不应该调用时)。这也是bug吗?

这是有问题的代码的精简版本,突出了问题。它只是检查传入的键/值对是否与初始状态值相同,并更新状态以标记它实际运行的内容。

当我按原样运行时,输出是:

我不希望这条线k v kv (= kv v) :b 2 2 true出现。最终结果是从第一个函数返回给 m-plus 的值,正如我所料,但我不希望第二个函数被调用。

现在,我发现如果我将填充符传递给不执行任何操作的 m-plus(即取消注释该(filler)行),那么输出是正确的,不会评估 :b 值。

如果我没有填充方法,并使第一个方法测试失败(即(check-k-v :a 2)再次将其更改为 then 一切都很好,我没有接到检查 :c 的电话,只有 a 和 b 被测试。

根据我对state-t maybe-m转换给我的理解,m-plus 函数应该如下所示:

这意味着right除非left返回 nil/false,否则不会调用它。

编辑: 在查看 state-t 和可能 -m 源之后,m-plus 看起来更像:

但原理是一样的,(first (drop-while nil? ...)只应在返回有效值的项目上执行。

我很想知道我的理解是否正确,以及为什么我必须使用填充方法来停止额外的评估(我不想发生这些影响)。

编辑:

如果我转而使用Jim Duey 的 parser-m 手写实现(来自他的优秀博客),则不会评估 m-plus 中的第二个函数,这似乎意味着转换 monad 正在破坏 m-plus。然而,即使在这个实现中,如果我删除函数中的初始(fetch-state)调用checker,domonad 定义会导致创建 m-plus 函数的输出,这表明在 domonad 的实现中会发生一些我没有预料到的事情。

为冗长的帖子道歉!

0 投票
2 回答
136 浏览

haskell - Haskell State Monad 和 Binary 没有输出所有内容

我一直在玩一些简单的二进制编码,它似乎在大多数情况下都能正常工作,直到我添加了 state monad。计划是使用状态来保存到目前为止我已写入字节串的内容的查找表,然后将偏移量写入字符串的先前实例而不是复制它们。

我检查并运行了所有类型,但后来我注意到它只是写出链中的最后一条指令。我改为使用 Control.Monad.State.Strict 但这没有任何区别,所以我怀疑我在其他地方犯了一个基本错误,但我不确定在哪里 - 我已经将代码缩减为基本功能. 另外,有没有更惯用的方式来做到这一点?

0 投票
1 回答
131 浏览

haskell - 从新创建的 monad 执行 monadic 代码

我目前有两个共享相同类型的 monad,实现类似于Statemonad:

它们之间的区别在于,第一个只允许读取上下文(bind 不会改变它),而第二个也允许编辑上下文。

然后有一些函数使用上下文FooRead来计算一些值而不改变上下文的状态:

现在我想从 writer monad 的代码中执行这些读取函数之一:

whereliftVal :: FooRead a -> FooWrite a是一个函数,它提取函数返回的值并将其FooRead滚动到FooWritemonad 中。这一切都很好。

但是,我想不出一种方法将getVal上面的执行从我的FooWritemonad 滚动到上下文中。通过上面的实现,getVal将运行在一个空的 monad 实例中。

我可以弄清楚如何FooRead使用FooWrite上下文构造一个实例

本质上,我想将我的作者降级为读者,在阅读器中执行代码,然后将其重新提升为作者。

但不是如何在这个 monad 中实际执行代码?

0 投票
1 回答
913 浏览

haskell - 将 Maybe 与 State Monad 一起使用

我正在尝试在 Haskell 中使用 push/pop/peek 操作实现一个 FIFO 队列,这就是我到目前为止所得到的。

所以上面的工作,我可以推/弹出/偷看我的队列。如您所见,我将返回类型包装在一个 Maybe 中,这样如果我弹出一个空队列或查看一个空队列,我会得到一个 Nothing,否则会得到一个 Just 元素。

所以我也认为我可以使用 State monad 轻松地链接操作。我进行如下:

好的,所以这似乎有效。我可以:

然后回来(Just 3,Queue {inbox = [1], outbox = []}),这就是我想要的。但我不能做这样的事情:

这导致:

现在我想我明白为什么会这样了,但我不知道如何让它做我想做的事。也就是说,使用>>=from a的链接pop应该能够输入到 apush中。我想我可能需要使用 StateT 转换器,但我还不太了解它们,所以我正在寻求有关如何实现该功能的帮助。还是我需要以完全不同的方式做到这一点?谢谢。

0 投票
2 回答
302 浏览

f# - 包裹状态单子的优点是什么?

这可能是一个愚蠢的,但是,看看(消除我通过like、monads和其他东西传递的显式状态

包裹起来有什么's -> 'a * 's好处State。仅仅是为了安全吗?