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

haskell - Haskell中的并行单子映射?像 parMapM 这样的东西?

我正在寻找一种在 ST-Monad 中并行运行两个计算的方法。我正在构建一个相当大的数组(使用 STUArray),我想并行进行。

到目前为止,我已经在 stackoverflow 上找到了这个这个问答,但是第一个不适用于我的情况,因为它只处理纯代码,第二个处理 IO monad - 但我在一个状态线程中。

我还找到了monad-parallel包,但它要求我有一个 ST 的“MonadParallel”实例。monad-par包也只支持纯计算或 IO monad。

有没有办法在 ST 内部进行并行一元计算?

0 投票
1 回答
283 浏览

haskell - 创建类似于具有链式状态的 IO Monad 的 monad

大家好,

今年我对 Haskell 还是很陌生(在 1990 年代初使用它之后,又在 00 年代初再次使用它)。我正在尝试编写一些代码,它使用的模式几乎直接类似于Haskell Wiki 上显示的示例 IO monad

(是的,我知道这不是 IO 的 GHC 实现,而只是理解它的一种工具。)原因是,在我的应用程序(游戏)中,我现在有两种模式来执行此操作,其中有两种不同的RealWorld替换. 一方面,它是游戏的状态,另一方面,它只是一个StdGen随机数种子。我当然现在有两对这样的类型:

(是的,我可以用两个参数将它们抽象成一对,但我还没有解决。)当然,你可以看到 myWithGS aWithRNG atypes(类型同义词)与上面的完全相似IO a

因此,这是我现在拥有的实际工作代码的简单示例:

这会在指定范围内创建一个随机对,并返回最终的 RNG 种子。我的大部分方法都是这样的(使用WithRNGor WithGS),使用链式状态,有时甚至达到r4or r6(或gs4等)。我宁愿写这个例子看起来像这样......

...但具有完全相同的方法签名和语义。这似乎应该可以按照上述给出这个例子的教程进行:

如您所见,这几乎正是我在上面所做的(一旦您将“ let”替换为“ where”符号)。

但是,我不能从类型同义词中创建 Monad。(我已经尝试过 TypeSynonymInstances 但它似乎不适用于“ instance Monad WithRNG where”或使用参数。使用 anewtype似乎也会添加无用的丑陋语法。)我无法很好地弄清楚 State Monad使用它做一个等效的方法。然而,即使我成功了,State Monad 实现似乎也使用了丑陋的“ get”和“ put”s(以及“ runState”s 等),并且使代码可读性降低,而不是更多。

经过这一切,我得出的结论是,我要么做错了什么,误解了某些事情,要么就是不能做我想做的事。我正要说“好吧,你真的不需要弄清楚如何修改你的代码来使状态被自动处理,因为它工作得很好”然后放弃了,然后我想我会在这里问(我的处女作潜伏)。我更喜欢更优雅的解决方案。

我还想一个更优雅的解决方案会给我这个我“免费”使用的功能:

感谢您的任何想法、建议、参考和您的时间!

0 投票
1 回答
817 浏览

haskell - 如何在不使用记录语法的情况下实现 MonadState 类?

我发现我很难理解MonadState

原因可能是大多数示例在其数据结构中与记录语法混淆。

因此,我尝试在不使用记录语法的情况下实现MonadState 。

我编写的以下代码确实通过了编译器,但对我来说似乎完全是一派胡言。

这些代码有什么问题?

有没有不使用记录语法实现MonadState的简单示例?

0 投票
2 回答
6513 浏览

haskell - 用于在构建列表时累积值的递归状态单子?

我对 Haskell 完全陌生,如果这个问题很愚蠢,我深表歉意。

我想要做的是递归地建立一个列表,同时建立一个基于递归调用的累积值。这是针对我正在为 Coursera 课程做的一个问题,所以我不会发布确切的问题,而是发布类似的问题。

例如,我想获取一个整数列表并将每个整数加倍(出于示例的目的,我可以使用 忽略map),但我还想计算数字“5”出现在列表中的次数。

所以要加倍我可以这样做:

到目前为止很容易。但是我怎样才能保持对五是多少次的计数x呢?我得到的最好的解决方案是使用这样的显式累加器,我不喜欢它反转列表,所以你需要在最后做一个反转:

但我觉得这应该能够由State我以前没有使用过的 monad 更好地处理,但是当我尝试构建一个符合我所见模式的函数时,由于递归调用foo. 有没有更好的方法来做到这一点?

编辑:我需要它来处理很长的列表,所以任何递归调用也需要是尾递归的。(由于 Haskell 的 'tail recursion modulo cons',我这里的例子是尾递归的)。

0 投票
1 回答
104 浏览

haskell - bind、put 和 return 在这里如何交互?

给定以下代码

我知道我可以将其翻译为:

我测试了有和没有 的两个函数put newGenerator >>,它们产生了不同的结果。我的问题是为什么?put函数是纯函数,运算符 ( )>>表示return value不受先前结果的影响。

0 投票
2 回答
270 浏览

haskell - 您如何从作为产品单子一部分的状态单子中“获取”当前状态?

我正在从 Control.Monad.Product 包构建一些产品单子。作为参考,产品单子类型为:

它的 monad 实例是:

来源:http ://hackage.haskell.org/packages/archive/monad-products/3.0.1/doc/html/src/Control-Monad-Product.html

问题一

我构建了一个简单的 monad,它是两个State IntMonad 的乘积,但是,当我接下来尝试访问底层状态时:

你看get只是创建了另一个State Int Int,我不确定如何实际获得底层状态的值,我该怎么做?请注意,我可能会获得潜在runState ab价值,但这个解决方案似乎不是很有用,因为这两个状态的初始值必须先验地固定。

问题二。

我真的很希望能够在不同类型的状态下创建一个产品单子,即:

但我收到这种类型的错误:

因为我认为两者get必须返回相同的类型,这是一个不幸的限制。关于如何解决这个问题的任何想法?

0 投票
2 回答
143 浏览

haskell - 为镜头寻找缺失的状态组合器

我目前的代码如下所示:

foo一个字段在哪里,Lens并且FoorunFoo :: MonadState m => Foo -> m Foo

我认为应该有一种方法可以在一行中执行此操作,但我找不到。我认为它应该有这样的评论:

问题:

  • 这样的组合器存在吗?如果是这样,那是什么?
  • 当我遇到这样的另一个问题时,搜索它的最佳方法是什么(即通常我会在 Hoogle 中输入它,但我没有运气好用镜头库做到这一点)
  • 这实际上是 Control.Monad 中的原始组合器吗?(如果这是 kleisli 箭的另一份工作,我会有点尴尬)
0 投票
3 回答
1101 浏览

haskell - 是否可以实现`(Applicative m) => Applicative (StateT sm)`?

我目前正在研究Data.Freshand Control.Monad.Trans.Fresh,分别是。定义一个用于生成新变量的接口,以及一个实现该接口的 monad 转换器。

我最初认为可以通过存在的唯一要求Applicative为我实现实例。但是,我被卡住了,似乎我需要 require 。不相信我的 Haskell-fu,然后我转向了变形金刚包,并对我在and中发现的内容感到惊讶:FreshT v mApplicative mMonad mControl.Monad.Trans.State.Lazy.Strict

所以这是我的问题:是否可以使用以下实例头创建具有等效语义的实例?

0 投票
3 回答
372 浏览

f# - 我可以在 F# 中同时使用不同的工作流吗?

我需要传递我的状态,同时能够将函数与可能的工作流程链接起来。有没有办法让 2 个工作流共享相同的上下文?如果不是,那是什么方法呢?

更新:

好吧,我有一个状态,它代表我要在数据库中创建的实体的一段可用 ID。因此,一旦获取了 ID,就必须将状态转换为具有下一个可用 ID 的更新状态并丢弃,以便没有人可以再次使用它。我不想为了习惯而改变状态。State monad 看起来像是一种方法,因为它隐藏了转换并传递状态。一旦状态工作流程到位,我就无法使用我在任何地方都使用的 Maybe 工作流程。

0 投票
1 回答
104 浏览

haskell - 状态单子和 gtk2hs

我试图在我的 GUI 应用程序上保留一些状态,以便我能够从用户输入中构造一个值列表。但是我很难理解 State monad 所以......
这里有一些测试代码来说明我想要什么(很明显它不会编译,甚至没有尝试过):

无论如何,我认为我应该使用 StateT 而不是 State,但它在我的脑海中完全是一团糟(已经阅读了这么多 tutos ......)。即使它有效,也不是很好,因为我在每个循环中都给出了 [] 的初始状态。问题是如何编写函数 addToList 以便每次按下更新按钮时,用户输入都会添加到某个状态(先前输入的列表)?