问题标签 [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 回答
1066 浏览

haskell - 使用 monad 编写更优雅代码的技巧?

我终于掌握了如何使用单子(不知道我是否理解它们......),但我的代码从来都不是很优雅。我想是因为缺乏对所有这些功能如何Control.Monad真正提供帮助的把握。因此,我认为使用 state monad 在特定代码段中询问有关此问题的提示会很好。

代码的目标是计算多种随机游走,这是我在更复杂的事情之前尝试做的事情。问题是我同时有两个有状态的计算,我想知道如何优雅地组合它们:

  1. 更新随机数生成器的函数是某种类型Seed -> (DeltaPosition, Seed)
  2. 更新随机游走器位置的函数是某种类型的DeltaPosition -> Position -> (Log, Position)Log我可以通过某种方式报告随机游走器的当前位置)。

我所做的是这样的:

我有一个函数来组成这两个有状态的计算:

然后我把它变成一个组成状态的函数:

然后我有一个最简单的东西,例如,一个随机游走器,它只会将一个随机数加到它的当前位置:

以及重复执行此操作的功能:

然后,如果我将其加载ghci并运行:

我得到了我想要的,这是随机游走者所占据的位置列表。但是......我觉得必须有一种更优雅的方式来做到这一点。我有两个问题:

  1. 我可以使用来自的聪明函数以更“单子”的方式重写这些函数Control.Monad吗?

  2. 有没有可以使用这样的组合状态的通用模式?这是否与单子变压器或类似的东西有关?

0 投票
1 回答
392 浏览

haskell - 状态单子:用一种模式换另一种模式?

所以我正在用 Haskell 编写一个游戏,我将玩家的回合表达为一系列与不同回合阶段相关的状态改变函数。最初,这看起来像:

国家单一性的主要候选人,对吧?这导致更优雅:

但是,似乎我必须更改phase1, phase2, et al 以从样板“状态获取”步骤开始:

我希望有一种方法可以将其抽象出来,这样我就可以避免调用者和被调用者的样板文件。我太新了,不知道这种方式是什么(这是我的第一个真正的 Haskell 项目)。有什么建议吗?

0 投票
6 回答
5266 浏览

haskell - How can I write a state monad that does error handling as well?

I need to write a state monad that can also support error handling. I was thinking of using the Either monad for this purpose because it can also provide details about what caused the error. I found a definition for a state monad using the Maybe monad however I am unable to modify it to use Either, instead of Maybe. Here's the code:

0 投票
3 回答
1995 浏览

haskell - 结合 StateT 和 State monad

可以说我有一个功能

和一个功能:

我想在它们之间使用fg传递状态。有库函数
StateT (return . runState f)吗?或者一般来说,给定一个具有相应 monad 的 monad 转换器,是否有它的库函数?

0 投票
3 回答
2699 浏览

data-structures - 在 Haskell 中快速更新大状态

对于我在 Haskell 中的矢量图形库,我必须携带一个相当大的状态:线条描边参数、颜色、剪辑路径等。我知道这样做的两种方法。引用Haskell-cafe的评论:“我建议你要么使用具有可变状态的 reader monad,要么使用具有不可变状态的 state monad”。

这是我的问题:更新一个大的不可变状态会导致性能下降。使用大量 STRef 就像在 Haskell 中编写 C:它冗长且丑陋。

这是不可变状态:

据我所知,“state { lineWidth = x }”创建了一个新的 GfxState 并让旧的 GfxState 被垃圾收集。当状态很大并且经常更新时,这会降低性能。

这是可变状态:

现在我到处都得到 (GfxState s) 和 (ST s) 和 (STRef s),这很冗长、令人困惑,并且违背了编写简短而富有表现力的代码的精神。我可以使用 C + FFI 来读取和更新大状态,但是由于我经常遇到这种模式,我希望有更好的方法。

0 投票
1 回答
202 浏览

haskell - 为特定状态数据类型导出多态 MonadState 函数

我正在尝试做的是(在我正在编写的模块中)导出一个适用于状态单子中特定类型的函数(在下面的示例中,该类型将是Foo)。但是我希望用户能够以MonadState他们希望的任何类型使用该函数:State.Lazy, State.Strict,StateT等。因此它的外部状态单子需要是多态的。

这是我想做的一个例子:

编辑了一个更好的问题:

GHC 抱怨需要 FlexibleInstances 扩展来定义上述类型。使用该扩展是定义我的功能的正确方法还是有更好的方法?

谢谢

0 投票
1 回答
1497 浏览

scala - 基本 Scalaz 状态问题

我如何使用State来模仿 的行为List.zipWithIndex?到目前为止我想出的(这不起作用)是:

这是非常松散地基于状态示例。正如我所说,它不起作用:

我可以通过更改 case 语句的一行来使其工作:

但这只是感觉不对。任何人都可以帮忙吗?

编辑-更多的玩耍让我明白了这一点

可以改进吗?它是否可以推广到除容器以外的容器List(如果可以,需要哪些类型类?)

编辑 2 -我现在已经概括了它,虽然有点笨拙

或非常相似:

0 投票
3 回答
13664 浏览

variables - State、ST、IORef 和 MVar 之间的区别

我正在48 小时内完成为自己编写一个方案(我最多大约 85 小时),并且我已经完成了关于添加变量和分配的部分。本章有一个很大的概念跳跃,我希望它分两步完成,中间有一个很好的重构,而不是直接跳到最终的解决方案。总之……</p>

我迷失了许多似乎服务于相同目的的不同类:StateSTIORefMVar. 前三个在正文中被提及,而最后一个似乎是很多 StackOverflow 关于前三个问题的首选答案。它们似乎都在连续调用之间携带一种状态。

它们各自是什么,它们之间有何不同?


特别是这些句子没有意义:

相反,我们使用一个称为状态线程的特性,让 Haskell 为我们管理聚合状态。这让我们可以像在任何其他编程语言中一样对待可变变量,使用函数来获取或设置变量。

IORef 模块允许您在 IO monad中使用有状态变量。

所有这一切都使这条线type ENV = IORef [(String, IORef LispVal)]令人困惑——为什么是第二条IORef?如果我改写会破坏什么type ENV = State [(String, LispVal)]

0 投票
1 回答
2261 浏览

polymorphism - OCaml 中的状态单子

我试图在 OCaml 中实现 state monad(作为练习)。我的实现如下所示:

我为记录字段选择了存在类型,因为我不喜欢使用仿函数并将状态类型包装在模块中的想法。getState上面的实现是有效的,但是我在实现and时遇到了问题setState。我试图像这样实现它们:

这不起作用,因为推断的字段类型,例如'a -> ('a * 'a)'a -> (unit * 'a),不如声明的类型通用's . 's -> ('a * 's)。我理解为什么会发生这种情况,但我想知道是否有另一种使用记录方法使其工作的方法?

谢谢。

干杯,亚历克斯

0 投票
2 回答
398 浏览

haskell - 这个 Monad Stack 函数的名称是什么?

我在 State monad 中有一堆有状态的函数。在程序中的某个时刻,需要一些 IO 操作,所以我将 IO 包装在 StateT 中,得到如下一对类型:

为了简单起见,我不想将 IO 上下文传递到主函数集中,并且我想避免将它们包装在 monad 堆栈类型中。但是为了从顶层函数调用它们,我需要类似于电梯的东西,但我并不是想从内部单子中提升一个值。相反,我想将 StateT monad 中的状态转换为 State monad 中的等价物。为此,我有以下内容:

然后这习惯于交错如下内容:

这似乎是一个相当明显的代码块,所以我想知道这个函数是否有一个标准名称,并且它已经在标准库的某个地方实现了?我试图使描述保持简单,但显然这延伸到将一个变压器从堆栈中拉出,将包装的值转换为变压器类型的表亲,跳过堆栈中下面的单子,然后将结果推回结束。