问题标签 [monad-transformers]

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 回答
1206 浏览

haskell - Haskell 提前退出状态单子(守卫?)

我有一个代表我的应用程序游戏状态的类型,对于这个问题,假设它很简单,例如:

我用 State monad 定义我的游戏逻辑。

我希望能够简单地丢弃一些输入

我想要一个看起来像这样的语法

如果它击中守卫,我希望它独自离开状态,并且在 block 中什么也不做

我该怎么做?使用 MonadPlus似乎很接近可能,但我不确定我是否可以使用 mzero 来表示“返回你已经拥有的状态”。谢谢!

0 投票
2 回答
474 浏览

haskell - 使用 ReaderT 创建可修改的环境

我一直在关注并扩展教程Write Yourself A Scheme。我有一种LispVal包裹在几层单子变压器中的类型:

using 的想法ReaderT是,我将能够通过评估器自动传递环境(它维护变量绑定),并且它的使用位置很明显,因为将调用ask. 这似乎比将环境作为额外参数显式传递更可取。当我开始实现延续时,我会想用ContTmonad 转换器做一个类似的技巧,并避免为延续传递额外的参数。

但是,我还没有弄清楚如何通过这样做来修改环境。例如,定义一个新变量或设置一个旧变量的值。

举一个具体的例子,假设每当我评估一个 if 语句时,我想将变量绑定it到 test 子句的结果。我的第一个想法是直接修改环境:

truthVal是一个将 a 分配Bool给 any的函数LispVal。但我不知道如何编写函数bind以修改环境。

我的第二个想法是使用local

但是这里bind需要有 type Env -> Env,而且由于我IORef在环境中使用 s 作为值,所以我只能写一个带有签名的函数Env -> IO Env

这甚至可能吗,还是我需要使用StateT而不是ReaderT

0 投票
2 回答
785 浏览

haskell - 使用 ResourceT 解决问题

我正在调整这个例子,特别是客户端。我会告诉你我认为问题是什么,遵循代码和它产生的错误。

这是问题所在,错误说没有 Control.Monad.Trans.Class.MonadTrans ResourceT 的实例

但我认为有,由于这个文档。那么哪里出了问题?

如下所述,有一些 janke 正在发生Control.Monad.Trans.Resource

这是ResourceT自省的结果。

版本resourcet

关于如何进行的任何想法?MonadTrans ResourceT 的实例在哪里?

0 投票
1 回答
440 浏览

haskell - 为什么不能将 ContT 设为 MonadError 的实例?

我有一个单子变压器堆栈,包括一个ErrorT,我想ContT r在整个东西周围包裹一个变压器。当我尝试这样做时,我对throwError生成类型错误的调用 - 显然ContT r不会自动成为MonadError. 好吧,我想——我就把它变成一个:

使用一些合适的定义liftCatch。但是现在编译时出现错误:

我很高兴使用 UndecidableInstances 杂注(我的印象不是太令人担忧,例如看到这个问题)但我想知道将延续转换器变成一个实例是否有困难MonadError- 我想如果它是好吧,这个包的作者Control.Monad.Trans早就做了……对吧?

0 投票
1 回答
1170 浏览

scala - 我可以使用 monad 转换器来简化这个组合吗?

假设我有

我想得到类型的结果,VS[Option[B]]但如果v是 a Success(None),结果也应该是 a Success(None)。这是一个例子:

然后:

成功案例是:

空壳是:

有没有“更好”的方式来做到这一点(可能涉及 kleisli 组合或单子变换器)?

0 投票
1 回答
2421 浏览

haskell - 重复调用 Haskell monad

我有一个返回 monad 的 Haskell 函数,声明如下:

此函数玩单人纸牌游戏,然后返回一个指示输赢的布尔值,以及WriterTmonad 中的日志。

我想调用这个函数一定次数,每次都使用随机生成器(StdGen)的“下一个”值,并将Bool返回值连接到一个列表中。

我尝试创建一个递归函数来执行调用,但无法弄清楚如何将 monad 传递到下一次迭代中。

我想效仿

并收集所有结果Bool值,以及来自WriterTmonad 的日志条目。

做这个的最好方式是什么?

0 投票
2 回答
533 浏览

f# - 如何在 F# 中组合状态和延续单子

我正在尝试使用任务并行库对树求和,其中子任务仅在遍历树直到一定深度之前才产生,否则它使用连续传递样式对剩余的子节点求和,以避免堆栈溢出。

然而,代码看起来很丑 - 使用状态单子来携带当前深度会很好,但状态单子不是尾递归的。或者,我将如何修改延续单子以携带状态?或者创建状态和延续单子的组合?

我在这篇博文中有更多细节:http: //taumuon-jabuka.blogspot.co.uk/2012/06/more-playing-with-monads.html

0 投票
1 回答
133 浏览

haskell - 正确的混叠控制单子

我有一个返回用户 ID 的单子函数:

我需要能够在 getUserId 上“叠加”一个函数,该函数查找并返回 getUserId 返回的值的别名

显然,我可以编写一个特定的函数 getAlias 并重写 monad 本身:

但是我觉得这可以通过将 getAlias 隐藏在 monad 的绑定函数中来更普遍、可重用和不可见地完成。

Monad Transformers 是否执行此功能,即将内部 monad 的绑定函数与外部 monad 的绑定函数组合在一起?或者我需要一些其他的控制结构吗?

0 投票
1 回答
1284 浏览

haskell - 我如何实际执行 StateT monad 和 IO?

我正在尝试遵循将状态与 IO 操作结合起来构建 AppState 和 IO monad 中给出的建议。我得到的是这样的:

这其中的某些部分我没有得到。script我有andmyMain 让我很困扰main。它还困扰着我,我必须在runState内部执行,并且我必须在我的主函数中myMain输入初始状态。runStateT我想要我的“脚本”,可以这么说,直接在 myMain 函数中,因为 myMain 的全部意义在于能够直接在 myMain 和打印操作旁边运行追加和求和。我想我应该能够做到这一点,而不是:

我曾认为 monad 转换器的目的是让我可以在函数中执行我的 State monad 操作(如上所示)并将 IO 操作提升到该函数中。设置所有这些以便我可以删除其中一个间接层的正确方法是什么?


除了 Daniel 的解决方案(我已经标记了该解决方案),我还发现了一些变体,它们也可能对这种情况有所帮助。一、myMain和main的最终实现:

现在,append 和 sumST 的各种实现,除了 Daniel 的:

和(注意只有类型声明改变;事实上你可以完全省略类型声明!)

我突然想到 AppState/StateT monad基本的 State monad 不同,我正在为 State monad 编写 sumST 和 append 代码。从某种意义上说,它们也必须被提升到 StateT monad 中,尽管正确的思考方式是它们必须在 monad 中运行(因此,runState script new)。

我不确定我是否完全理解它,但我会使用它一段时间,阅读 MonadState 代码,并在它最终在我脑海中运行时写一些关于它的东西。

0 投票
1 回答
178 浏览

haskell - 在 Pipes-2.1.0 包中完成

我正在使用 Pipes-2.1.0 包和 zeromq3-haskell 包来构建一个小消息管道。除了我无法理解 Frames 的最终确定之外,一切似乎都进展顺利。

在接下来的框架中,我获得了两个资源;zeromq 上下文和 zeromq 套接字。然后我不断地等待消息(以 的形式ByteStrings)在 zeromq 套接字上发布。

现在如果我试试这个:

我明白了:

publisher收到后完成,但一个BytesString

为什么会这样?

我对在 Pipes-2.1.0 中使用 Frames 进行最终确定有什么误解?

如果我开始攻击外面的树,它还有机会吗?