问题标签 [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 - 使用 monad 编写更优雅代码的技巧?
我终于掌握了如何使用单子(不知道我是否理解它们......),但我的代码从来都不是很优雅。我想是因为缺乏对所有这些功能如何Control.Monad
真正提供帮助的把握。因此,我认为使用 state monad 在特定代码段中询问有关此问题的提示会很好。
代码的目标是计算多种随机游走,这是我在更复杂的事情之前尝试做的事情。问题是我同时有两个有状态的计算,我想知道如何优雅地组合它们:
- 更新随机数生成器的函数是某种类型
Seed -> (DeltaPosition, Seed)
- 更新随机游走器位置的函数是某种类型的
DeltaPosition -> Position -> (Log, Position)
(Log
我可以通过某种方式报告随机游走器的当前位置)。
我所做的是这样的:
我有一个函数来组成这两个有状态的计算:
然后我把它变成一个组成状态的函数:
然后我有一个最简单的东西,例如,一个随机游走器,它只会将一个随机数加到它的当前位置:
以及重复执行此操作的功能:
然后,如果我将其加载ghci
并运行:
我得到了我想要的,这是随机游走者所占据的位置列表。但是......我觉得必须有一种更优雅的方式来做到这一点。我有两个问题:
我可以使用来自的聪明函数以更“单子”的方式重写这些函数
Control.Monad
吗?有没有可以使用这样的组合状态的通用模式?这是否与单子变压器或类似的东西有关?
haskell - 状态单子:用一种模式换另一种模式?
所以我正在用 Haskell 编写一个游戏,我将玩家的回合表达为一系列与不同回合阶段相关的状态改变函数。最初,这看起来像:
国家单一性的主要候选人,对吧?这导致更优雅:
但是,似乎我必须更改phase1
, phase2
, et al 以从样板“状态获取”步骤开始:
我希望有一种方法可以将其抽象出来,这样我就可以避免调用者和被调用者的样板文件。我太新了,不知道这种方式是什么(这是我的第一个真正的 Haskell 项目)。有什么建议吗?
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:
haskell - 结合 StateT 和 State monad
可以说我有一个功能
和一个功能:
我想在它们之间使用f
并g
传递状态。有库函数
StateT (return . runState f)
吗?或者一般来说,给定一个具有相应 monad 的 monad 转换器,是否有它的库函数?
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 来读取和更新大状态,但是由于我经常遇到这种模式,我希望有更好的方法。
haskell - 为特定状态数据类型导出多态 MonadState 函数
我正在尝试做的是(在我正在编写的模块中)导出一个适用于状态单子中特定类型的函数(在下面的示例中,该类型将是Foo
)。但是我希望用户能够以MonadState
他们希望的任何类型使用该函数:State.Lazy
, State.Strict
,StateT
等。因此它的外部状态单子需要是多态的。
这是我想做的一个例子:
编辑了一个更好的问题:
GHC 抱怨需要 FlexibleInstances 扩展来定义上述类型。使用该扩展是定义我的功能的正确方法还是有更好的方法?
谢谢
scala - 基本 Scalaz 状态问题
我如何使用State
来模仿 的行为List.zipWithIndex
?到目前为止我想出的(这不起作用)是:
这是非常松散地基于状态示例。正如我所说,它不起作用:
我可以通过更改 case 语句的一行来使其工作:
但这只是感觉不对。任何人都可以帮忙吗?
编辑-更多的玩耍让我明白了这一点
可以改进吗?它是否可以推广到除容器以外的容器List
(如果可以,需要哪些类型类?)
编辑 2 -我现在已经概括了它,虽然有点笨拙
或非常相似:
variables - State、ST、IORef 和 MVar 之间的区别
我正在48 小时内完成为自己编写一个方案(我最多大约 85 小时),并且我已经完成了关于添加变量和分配的部分。本章有一个很大的概念跳跃,我希望它分两步完成,中间有一个很好的重构,而不是直接跳到最终的解决方案。总之……</p>
我迷失了许多似乎服务于相同目的的不同类:State
、ST
、IORef
和MVar
. 前三个在正文中被提及,而最后一个似乎是很多 StackOverflow 关于前三个问题的首选答案。它们似乎都在连续调用之间携带一种状态。
它们各自是什么,它们之间有何不同?
特别是这些句子没有意义:
相反,我们使用一个称为状态线程的特性,让 Haskell 为我们管理聚合状态。这让我们可以像在任何其他编程语言中一样对待可变变量,使用函数来获取或设置变量。
和
IORef 模块允许您在 IO monad中使用有状态变量。
所有这一切都使这条线type ENV = IORef [(String, IORef LispVal)]
令人困惑——为什么是第二条IORef
?如果我改写会破坏什么type ENV = State [(String, LispVal)]
?
polymorphism - OCaml 中的状态单子
我试图在 OCaml 中实现 state monad(作为练习)。我的实现如下所示:
我为记录字段选择了存在类型,因为我不喜欢使用仿函数并将状态类型包装在模块中的想法。getState
上面的实现是有效的,但是我在实现and时遇到了问题setState
。我试图像这样实现它们:
这不起作用,因为推断的字段类型,例如'a -> ('a * 'a)
和'a -> (unit * 'a)
,不如声明的类型通用's . 's -> ('a * 's)
。我理解为什么会发生这种情况,但我想知道是否有另一种使用记录方法使其工作的方法?
谢谢。
干杯,亚历克斯
haskell - 这个 Monad Stack 函数的名称是什么?
我在 State monad 中有一堆有状态的函数。在程序中的某个时刻,需要一些 IO 操作,所以我将 IO 包装在 StateT 中,得到如下一对类型:
为了简单起见,我不想将 IO 上下文传递到主函数集中,并且我想避免将它们包装在 monad 堆栈类型中。但是为了从顶层函数调用它们,我需要类似于电梯的东西,但我并不是想从内部单子中提升一个值。相反,我想将 StateT monad 中的状态转换为 State monad 中的等价物。为此,我有以下内容:
然后这习惯于交错如下内容:
这似乎是一个相当明显的代码块,所以我想知道这个函数是否有一个标准名称,并且它已经在标准库的某个地方实现了?我试图使描述保持简单,但显然这延伸到将一个变压器从堆栈中拉出,将包装的值转换为变压器类型的表亲,跳过堆栈中下面的单子,然后将结果推回结束。