问题标签 [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 - Haskell中的并行单子映射?像 parMapM 这样的东西?
我正在寻找一种在 ST-Monad 中并行运行两个计算的方法。我正在构建一个相当大的数组(使用 STUArray),我想并行进行。
到目前为止,我已经在 stackoverflow 上找到了这个和这个问答,但是第一个不适用于我的情况,因为它只处理纯代码,第二个处理 IO monad - 但我在一个状态线程中。
我还找到了monad-parallel包,但它要求我有一个 ST 的“MonadParallel”实例。monad-par包也只支持纯计算或 IO monad。
有没有办法在 ST 内部进行并行一元计算?
haskell - 创建类似于具有链式状态的 IO Monad 的 monad
大家好,
今年我对 Haskell 还是很陌生(在 1990 年代初使用它之后,又在 00 年代初再次使用它)。我正在尝试编写一些代码,它使用的模式几乎直接类似于Haskell Wiki 上显示的示例 IO monad:
(是的,我知道这不是 IO 的 GHC 实现,而只是理解它的一种工具。)原因是,在我的应用程序(游戏)中,我现在有两种模式来执行此操作,其中有两种不同的RealWorld
替换. 一方面,它是游戏的状态,另一方面,它只是一个StdGen
随机数种子。我当然现在有两对这样的类型:
(是的,我可以用两个参数将它们抽象成一对,但我还没有解决。)当然,你可以看到 myWithGS a
和WithRNG a
types(类型同义词)与上面的完全相似IO a
。
因此,这是我现在拥有的实际工作代码的简单示例:
这会在指定范围内创建一个随机对,并返回最终的 RNG 种子。我的大部分方法都是这样的(使用WithRNG
or WithGS
),使用链式状态,有时甚至达到r4
or r6
(或gs4
等)。我宁愿写这个例子看起来像这样......
...但具有完全相同的方法签名和语义。这似乎应该可以按照上述给出这个例子的教程进行:
如您所见,这几乎正是我在上面所做的(一旦您将“ let
”替换为“ where
”符号)。
但是,我不能从类型同义词中创建 Monad。(我已经尝试过 TypeSynonymInstances 但它似乎不适用于“ instance Monad WithRNG where
”或使用参数。使用 anewtype
似乎也会添加无用的丑陋语法。)我无法很好地弄清楚 State Monad使用它做一个等效的方法。然而,即使我成功了,State Monad 实现似乎也使用了丑陋的“ get
”和“ put
”s(以及“ runState
”s 等),并且使代码的可读性降低,而不是更多。
经过这一切,我得出的结论是,我要么做错了什么,误解了某些事情,要么就是不能做我想做的事。我正要说“好吧,你真的不需要弄清楚如何修改你的代码来使状态被自动处理,因为它工作得很好”然后放弃了,然后我想我会在这里问(我的处女作潜伏)。我更喜欢更优雅的解决方案。
我还想一个更优雅的解决方案会给我这个我“免费”使用的功能:
感谢您的任何想法、建议、参考和您的时间!
haskell - 如何在不使用记录语法的情况下实现 MonadState 类?
我发现我很难理解MonadState。
原因可能是大多数示例在其数据结构中与记录语法混淆。
因此,我尝试在不使用记录语法的情况下实现MonadState 。
我编写的以下代码确实通过了编译器,但对我来说似乎完全是一派胡言。
这些代码有什么问题?
有没有不使用记录语法实现MonadState的简单示例?
haskell - 用于在构建列表时累积值的递归状态单子?
我对 Haskell 完全陌生,如果这个问题很愚蠢,我深表歉意。
我想要做的是递归地建立一个列表,同时建立一个基于递归调用的累积值。这是针对我正在为 Coursera 课程做的一个问题,所以我不会发布确切的问题,而是发布类似的问题。
例如,我想获取一个整数列表并将每个整数加倍(出于示例的目的,我可以使用 忽略map
),但我还想计算数字“5”出现在列表中的次数。
所以要加倍我可以这样做:
到目前为止很容易。但是我怎样才能保持对五是多少次的计数x
呢?我得到的最好的解决方案是使用这样的显式累加器,我不喜欢它反转列表,所以你需要在最后做一个反转:
但我觉得这应该能够由State
我以前没有使用过的 monad 更好地处理,但是当我尝试构建一个符合我所见模式的函数时,由于递归调用foo
. 有没有更好的方法来做到这一点?
编辑:我需要它来处理很长的列表,所以任何递归调用也需要是尾递归的。(由于 Haskell 的 'tail recursion modulo cons',我这里的例子是尾递归的)。
haskell - bind、put 和 return 在这里如何交互?
给定以下代码
我知道我可以将其翻译为:
我测试了有和没有 的两个函数put newGenerator >>
,它们产生了不同的结果。我的问题是为什么?put
函数是纯函数,运算符 ( )>>
表示return value
不受先前结果的影响。
haskell - 您如何从作为产品单子一部分的状态单子中“获取”当前状态?
我正在从 Control.Monad.Product 包构建一些产品单子。作为参考,产品单子类型为:
它的 monad 实例是:
问题一
我构建了一个简单的 monad,它是两个State Int
Monad 的乘积,但是,当我接下来尝试访问底层状态时:
你看get
只是创建了另一个State Int Int
,我不确定如何实际获得底层状态的值,我该怎么做?请注意,我可能会获得潜在runState
a
的b
价值,但这个解决方案似乎不是很有用,因为这两个状态的初始值必须先验地固定。
问题二。
我真的很希望能够在不同类型的状态下创建一个产品单子,即:
但我收到这种类型的错误:
因为我认为两者get
必须返回相同的类型,这是一个不幸的限制。关于如何解决这个问题的任何想法?
haskell - 为镜头寻找缺失的状态组合器
我目前的代码如下所示:
foo
一个字段在哪里,Lens
并且Foo
runFoo :: MonadState m => Foo -> m Foo
我认为应该有一种方法可以在一行中执行此操作,但我找不到。我认为它应该有这样的评论:
问题:
- 这样的组合器存在吗?如果是这样,那是什么?
- 当我遇到这样的另一个问题时,搜索它的最佳方法是什么(即通常我会在 Hoogle 中输入它,但我没有运气好用镜头库做到这一点)
- 这实际上是 Control.Monad 中的原始组合器吗?(如果这是 kleisli 箭的另一份工作,我会有点尴尬)
haskell - 是否可以实现`(Applicative m) => Applicative (StateT sm)`?
我目前正在研究Data.Fresh
and Control.Monad.Trans.Fresh
,分别是。定义一个用于生成新变量的接口,以及一个实现该接口的 monad 转换器。
我最初认为可以通过存在的唯一要求Applicative
为我实现实例。但是,我被卡住了,似乎我需要 require 。不相信我的 Haskell-fu,然后我转向了变形金刚包,并对我在and中发现的内容感到惊讶:FreshT v m
Applicative m
Monad m
Control.Monad.Trans.State.Lazy
.Strict
所以这是我的问题:是否可以使用以下实例头创建具有等效语义的实例?
f# - 我可以在 F# 中同时使用不同的工作流吗?
我需要传递我的状态,同时能够将函数与可能的工作流程链接起来。有没有办法让 2 个工作流共享相同的上下文?如果不是,那是什么方法呢?
更新:
好吧,我有一个状态,它代表我要在数据库中创建的实体的一段可用 ID。因此,一旦获取了 ID,就必须将状态转换为具有下一个可用 ID 的更新状态并丢弃,以便没有人可以再次使用它。我不想为了习惯而改变状态。State monad 看起来像是一种方法,因为它隐藏了转换并传递状态。一旦状态工作流程到位,我就无法使用我在任何地方都使用的 Maybe 工作流程。
haskell - 状态单子和 gtk2hs
我试图在我的 GUI 应用程序上保留一些状态,以便我能够从用户输入中构造一个值列表。但是我很难理解 State monad 所以......
这里有一些测试代码来说明我想要什么(很明显它不会编译,甚至没有尝试过):
无论如何,我认为我应该使用 StateT 而不是 State,但它在我的脑海中完全是一团糟(已经阅读了这么多 tutos ......)。即使它有效,也不是很好,因为我在每个循环中都给出了 [] 的初始状态。问题是如何编写函数 addToList 以便每次按下更新按钮时,用户输入都会添加到某个状态(先前输入的列表)?