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

haskell - 如何在 Haskell 中构建一个不确定的状态单子?

我想在 Haskell 中建立一个不确定的状态单子。这将允许我使用构建状态生成搜索空间中的所有元素以修剪不良位置。假设我有以下(伪)代码:

这里有几件事是行不通的:我需要了解的最基本的事情是如何做一些事情来陈述,然后将它传递到每个expand分支。我已经尝试了很多使用类型函数的方法,State Int [ State Int Element]但最终,一旦我将 list monad 的分支包装在状态包装器中,我就无法删除它,对吧?那么有没有办法做到这一点?

谢谢。

0 投票
1 回答
705 浏览

scala - 遍历状态单子时如何处理嵌套结构

我有一个嵌套结构,我正在使用 scalaz 状态单子将其转换为 XML。在我必须处理多级嵌套结构之前,这很有效。这是一个类似于我正在做的简化示例。给定以下 ADT:

我使用状态 monad 编写了一个转换器对象(假设 Scalaz7 和以下导入import scalaz.{Node => _, _}; import Scalaz._; import scala.xml._):

根据我的堆栈设置,convert(nested(1000)).apply(Parents(0, 0))在转换过程中会导致堆栈溢出。(较高的值会导致nested溢出,但这可以忽略,因为我刚刚nested为这个问题创建了。):

我的问题是 - 避免堆栈溢出的最佳方法是什么scalaz.stateT?如果使 XML 序列化逻辑更易于遵循和排除故障,我想继续使用 state monad,就像在我的真实示例中一样(实际输入结构是从实时调试会话中检索到的 JDI 镜像对象和数组,内部值是嵌套字段值) .

编辑:取出嵌套堆栈问题:

0 投票
2 回答
624 浏览

haskell - How to convert a STArray to a List in Haskell?

Is there a function can do what the function arrayToList do:

If not, how to write one?

0 投票
4 回答
2985 浏览

haskell - Control.Monad.State API 最近是否发生了变化?

作为学习练习,我正在尝试在 Haskell 中实现堆排序。我认为Statemonad 将是这样做的正确选择,因为堆非常依赖于在单个结构内移动数据(并且do符号会很有用)。此外,我希望总体上巩固我对单子的理解。

Learn You A Haskell(以及许多其他教程)中关于monad示例,State定义为: State

我应该将一个类型的函数s -> (a,s)(可能会或可能不会在其他参数中进行咖喱)传递给State值构造函数。所以我的函数看起来像这样:

这不会编译,出现以下错误:

通过阅读API 文档Control.Monad.State似乎State自从编写了这些教程以来,值构造函数已从模块中删除。作为初学者,我发现文档远非一目了然。所以我的问题是:

  1. 我是否相信State值构造函数已经消失了?
  2. 我应该改用什么?
0 投票
1 回答
487 浏览

haskell - 卡在状态单子中

我想使用节点和唯一键的 IntMap 创建图形结构。这个话题在这里这里已经很好地涵盖了. 我通过基本上将 state -> (val,state) 的函数包装在一个新类型中来理解 state monad 的工作原理,这样我们就可以为它创建一个 monad 实例。我已经阅读了很多关于这个主题的内容。我似乎仍然无法理解如何在整个程序执行过程中获得唯一(或只是增量)值。获得一系列连续的 ID 很容易,但是一旦我“runState”退出 monad,我似乎又回到了开始跟踪当前 ID 的地方。我觉得我被困在单子里了。我考虑的另一个选择是将整个 IntMap 和当前的“下一个”ID 保留为状态,但这似乎非常“必要”和极端。问题非常相似,但没有得到很多答案(或者我只是遗漏了一些明显的东西)。在整个程序执行过程中,利用 state monad 获取唯一 ID 的惯用方法是什么?谢谢。

0 投票
3 回答
507 浏览

haskell - 有人可以介绍一下状态单子中的绑定是如何实现的(除其他外)吗?

尽管阅读了 LYAH 中非常清楚的解释,然后是 Haskell Wiki 和其他一些东西,但我仍然对 state monad 的实现方式感到困惑。我想我明白它是什么,虽然我不自信。

所以假设我有一些微不足道的数据类型:

还有这个:

然后我让 SimpleState 成为一个单子

问题 1: lambda 如何将 s ( for state ) 作为参数?它是如何传入的?

问题2:如果applySimple在其函数签名中接受一个参数,为什么我applySimple st s在lambda里面?为什么要applySimple申请两次?

更令人困惑的是,这件事改变了状态:

问题 3. 这是什么?为什么它对 SimpleState 执行某种操作,但它的签名不是函数?

所以现在我可以将 tic 传递给这个函数:

问题 4:我可以/我如何将 tic 与 tic 一起使用>>=

并像这样使用它:

我明白了:

同样,applySimple应用于两个参数,这让我感到困惑。

总而言之,我对构造函数SimpleState正在接受一个将 s 作为参数的函数,并且不知道它来自于它在上下文中的使用方式这一事实感到非常困惑。

0 投票
1 回答
408 浏览

haskell - Haskell:尝试对简单的 State monad get 和 put 进行脱糖

为了研究 State monad 的细节,我正在尝试为自己创建一个简单的 state monad 函数的完整脱糖版本,完成在“如何获取”实际上 /get/ Haskell 中的初始状态?,在 J Cooper 的回答中。

示例状态单子函数只是交换状态和输入值,因此(从概念上讲)如果输入是 (v, s),那么输出是 (s, v)。我展示了三种翻译,首先从 do 符号到脱糖的 >>= 和 >>,然后将这些运算符放在函数位置,最后尝试替换它们并使用它们的定义获取/放置。

'do' 版本和前两个翻译有效,但最终翻译无效。问题:

  1. 加载模块后,GHCi 报告 z1 不在范围内。
  2. 我还没有弄清楚如何表示省略在 >> 翻译中传递的参数。

这些应该如何解决?

FWIW,当前的 Haskell 平台(GHC 7.4.2)。

谢谢!

0 投票
1 回答
474 浏览

haskell - 在这种情况下,为什么在与嵌套的 StateT monadT 交互时不需要使用“lift”?

假设我有一个 monadT:

这里要注意的重要一点是,一个 StateT 包装了另一个,并且两者都包装在第三个 MonadT 中,即 ReaderT。

以及相应的 runWrap 函数为方便起见:

还有一个通用的 tock 状态单子:

我现在创建一个 wrap monadT,其中我使用 tock:

并运行它:

lift就我对如何与 MonadT 的嵌套层进行交互的理解而言,这里的使用对我来说很有意义。

但是,这也有效并给了我相同的答案(201,2)

我认为通过调用tockw/o lift,它看起来好像tock应用于外部 MonadT,即 ReaderT,这是没有意义的。但为什么这行得通?

PS 请忽略Env这里的存在,它与问题无关,只是我正在使用的外部 MonadT 的选择。

0 投票
0 回答
231 浏览

haskell - 模型和 GUI IO (Wx) 的分离状态:堆栈还是 FRP?

对于我的图表工具,我想保持核心模型的代码与 GUI 隔离。

在下面的示例中,“状态”是用 传递的vDiag,它是一个Tvar。这是 wx 中的设计决策。现在,对于我的图表工具,我希望将核心模型“存储”在一个fgl图表中(其中包含复杂类型),并且wx只给出一个视图;比如说在这个例子中,绘画时读取访问的点列表,以及单击、拖动等时要写入的一些功能......。我首先想到了一些 Monad 堆栈,但即使将 StateT 和来自 wx 的 IO 组合起来看起来也并不简单,因为 io 动作遍布在回调的代码中(点击、绘画等)。感觉就像在堆栈底部有 IO 不再适合了。

那么你如何传递一个状态,或者它不是要走的路?(我直觉这是经典。RFP 是这样开始的吗?)

(在代码中,当点击时绘制红色圆圈,点列表在 a 中传递Tvar vDiag。我在等效状态访问器所在的位置标记了“--fgl”。并设置了一个基本的 fgl 测试图访问器说明。我想提出一个状态)(我最初试图在没有 FRP 的情况下试一试 - 反应香蕉,以了解问题,但我想我可能已经成功了 ;-)

0 投票
1 回答
207 浏览

arrays - 找不到使用 STUArray 的函数的正确签名(GHC 也不能)

我使用 ST-Monad 和未装箱的 STArrays (STUArray) 构建了一个用于查找矩阵行列式的函数。矩阵的类型如下:

也就是说,一个不可变数组,其中包含包含元素的不可变未装箱数组。这将要求我将 Predicate 添加IArray UArray e到处理 的函数中Matrix,而这又需要FlexibleContexts. 好的,完成。

用于计算行列式的函数具有以下签名:

我还需要添加谓词MArray (STUArray s) e (ST s),因为在内部数组被转换为可变数组(外部装箱,内部未装箱)。

这个函数可以这样使用:

工作正常。但是看看它有多丑!当然,我不想放弃 of 的内部结构Matrix(至少不会超出附加到我的函数的谓词已经让我这样做)。我想定义以下函数:

而我不能。

我试过没有正确的签名:

失败。公平地说,我会让我的大脑工作:detST需要IArray UArray e, MArray (STUArray s) e (ST s), Num e, Eq e, Division e,所以需要,det不是吗?

失败。但我不明白怎么做。GHC ( 7.4.2 ) 给我的信息是:

但是那个确切的术语在谓词中!

GHC 建议:

好的。至于我的理解,我已经做了第一件事。也确实存在一个实例(MArray ...)(否则,我怎么能在 main 中成功使用它?!)。

我不确定这里有什么问题。我相信它与 in 中的“隐藏”ST 状态有关s,并且 s与indetST不同,但我不知道如何为此编写类型。ssdet

什么是正确的定义det- 为什么?

没有det编译的程序只使用FlexibleContexts,没有警告-Wall。完整的源代码可以在这里找到。