问题标签 [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.
haskell - 具有多个状态值的状态单子
考虑以下:
我希望这会导致23
. 有没有办法在纯 Haskell 中实现这样的东西,如果是这样,怎么做?我明白STRef
会做这样的事情,但我只想用普通的 Haskell 来做(目前不担心效率)。我想我必须创建一个数据类型并使其成为 的实例Monad
,但我不确定细节,所以一个工作示例会很有帮助。
scala - 用于理解的 Scala 状态单子
我在这里学习迈克尔·皮尔奎斯特(Michael Pilquist)的优秀状态单子讲座。我在 54 分钟时遇到了两个问题。
如果
ofs
是Option[FollowerStats]
,那么?
运算符是什么?我在 Scala 2.10.2 中的 Option 上找不到三元运算符最后一个生成器如何将更新的缓存(增加命中或未命中)放回
State
checkCache 方法的结果中?返回的State
似乎被丢弃了,而 for 理解似乎只产生了Option[FollowerStats]
.
为了尝试理解,我尝试重新编写 for理解,但这没有帮助。
更新:
由于答案,我想我已经掌握了第 2 点的关键。我没有意识到 yield 本质上是在说:从 中获取最后一个状态s => (s,())
并用 ofsput
替换Unit
值类型,以获取s =>(s,ofs)
. 我想关键是要意识到收益并不是字面上的返回,而是被翻译为 State.map。
更新 现在了解选项位。我猜这个演示文稿仍然使用了 Scalaz 的隐式,尽管它派生了 state monad。
haskell - 带引用的 Haskell 数据类型
我正在实现 Ukkonen 的算法,它要求树的所有叶子都包含对同一整数的引用,我在 Haskell 中这样做以了解有关该语言的更多信息。但是,我很难写出执行此操作的数据类型。
如何将引用放在Leaf
类型声明中?
haskell - Haskell MonadState 实现 put 和 modify
我想用 modify 来实现 put
当我做
我收到错误,
预期类型:m()
实际类型:m((),s)
我尝试过这样的事情
获得预期的类型 m()
但此解决方案不起作用
有人可以向我解释如何使用 modify 来实现 put 吗?
感谢您的时间和帮助。
haskell - 带有谓词的状态单子
我正在尝试创建一些看起来很像 State monad 的东西,但也带有一个谓词列表和伴随状态的转换函数。我设想的计算的基本步骤如下:
Foo (state, [(pred, t)]) >>= f
. 适用f
于s
,屈服s'
。然后将每个谓词应用于s'
. 对于每个匹配的谓词,依次将关联的转换函数应用于状态。例如假设[(p1, t1), (p2, t2), (p3, t3)]
,f
和s
。如果在f s
yield之后s'
,p1 s'
并且p3 s'
两者都 return True
,您将执行t1 s'
yielding s''
,然后执行t3 s''
yielding s'''
,即计算结果。
这里有很多活动部件,我觉得正确的方法是在 StateT 变压器或 State monad 之上构建它,但我不知道从哪里开始。
我觉得这好像不是很清楚。非常感谢任何能使这一点更清楚的澄清。
clojure - clojure.algo.monad 使用 parser-m 的奇怪 m-plus 行为 - 为什么要评估第二个 m-plus?
我在写的一些单子中出现了意想不到的行为。我创建了一个 parser-m monad
我使用 m-plus 作为一种贯穿查询机制,在我的例子中,它首先从缓存(数据库)中读取值,如果返回 nil,下一个方法是从“live”中读取( REST 调用)。
但是,总是调用 m-plus 列表中的第二个值,即使它的值被忽略(如果缓存命中良好)并且最终返回的是第一个单子函数的值。
这是我看到的问题的简化版本,以及我找到的一些解决方案,但我不知道为什么。
我的问题是:
- 这是预期的行为还是 m-plus 中的错误?即,即使第一项返回值,m-plus 列表中的第二个方法是否总是被评估?
- 与上述相比较小,但如果我
_ (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 的实现中会发生一些我没有预料到的事情。
为冗长的帖子道歉!
haskell - Haskell State Monad 和 Binary 没有输出所有内容
我一直在玩一些简单的二进制编码,它似乎在大多数情况下都能正常工作,直到我添加了 state monad。计划是使用状态来保存到目前为止我已写入字节串的内容的查找表,然后将偏移量写入字符串的先前实例而不是复制它们。
我检查并运行了所有类型,但后来我注意到它只是写出链中的最后一条指令。我改为使用 Control.Monad.State.Strict 但这没有任何区别,所以我怀疑我在其他地方犯了一个基本错误,但我不确定在哪里 - 我已经将代码缩减为基本功能. 另外,有没有更惯用的方式来做到这一点?
haskell - 从新创建的 monad 执行 monadic 代码
我目前有两个共享相同类型的 monad,实现类似于State
monad:
它们之间的区别在于,第一个只允许读取上下文(bind 不会改变它),而第二个也允许编辑上下文。
然后有一些函数使用上下文FooRead
来计算一些值而不改变上下文的状态:
现在我想从 writer monad 的代码中执行这些读取函数之一:
whereliftVal :: FooRead a -> FooWrite a
是一个函数,它提取函数返回的值并将其FooRead
滚动到FooWrite
monad 中。这一切都很好。
但是,我想不出一种方法将getVal
上面的执行从我的FooWrite
monad 滚动到上下文中。通过上面的实现,getVal
将运行在一个空的 monad 实例中。
我可以弄清楚如何FooRead
使用FooWrite
上下文构造一个实例
本质上,我想将我的作者降级为读者,在阅读器中执行代码,然后将其重新提升为作者。
但不是如何在这个 monad 中实际执行代码?
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 转换器,但我还不太了解它们,所以我正在寻求有关如何实现该功能的帮助。还是我需要以完全不同的方式做到这一点?谢谢。
f# - 包裹状态单子的优点是什么?
这可能是一个愚蠢的,但是,看看(消除我通过like、monads和其他东西传递的显式状态)
包裹起来有什么's -> 'a * 's
好处State
。仅仅是为了安全吗?