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

haskell - IdentityT 转换器的目的是什么?

在查看 transformers 包时,我发现了这个名为IdentityT的 monad 转换器。

尽管我了解 Identity monad 的使用方式(例如State只是 的别名StateT Identity)以及 monad 转换器的一般工作方式,但我不知道这与IdentityT.

由于它不在 MTL 中,我猜它只是为了完整性而添加在那里并且没有实际用途。那是对的吗?

0 投票
1 回答
732 浏览

haskell - 如何将 monad-control 用于 ReaderT 上的简单新类型包装器

我已经定义了一个简单的 monad 转换器,EntityBuilderT它只是一个 newtype over ReaderT

为了将函数包装在新的“环境”中,我编写了以下组合器:

在某些情况下,我还想构建一个更大的变压器堆栈。例如:

显然,我不能应用withNewSource这个函数f,因为 monad 类型不再匹配。因此,我尝试使用monad-control这种组合器来编写新版本。

到目前为止,我编写的代码如下所示。尽管实例定义似乎没问题,但编译器 (GHC 7.4.1) 拒绝代码并显示以下消息:

我有些失落。任何人都明白真正的问题是什么?


0 投票
1 回答
212 浏览

parsing - 使正常的单子函数与单子变换器等效

我正在尝试解决平衡括号问题。我不想做连续的 IO,而宁愿只调用一次 getLine 并解析结果字符串。因此,解决问题的函数将处理两种不同的状态:输入字符串的未使用部分和括号堆栈。

我想设置一些函数来操作堆栈:

如果我在 state monad 中操作,那一切都很好,但是我在 StateT monad 中操作

我知道我被告知不要在堆栈中有重复的单子。我这样做是因为我喜欢它简化 push 和 pop 定义的方式。

两个问题:

  1. 无论我做什么,我都找不到将推送和弹出应用到 StateT 中包含的堆栈的方法。
  2. 我不知道如何从主函数调用它

这是其余的代码

0 投票
2 回答
625 浏览

list - 如何在列表和 ListT monad 转换器之间干净地转换?

我目前正在编写一个项目,我大量使用了ListTmonad 转换器。使用普通列表时,实现非确定性非常容易。但是,一旦我不得不将我的代码转换为1ListT,它就会变得更加复杂。

举个简单的例子:从[a]到转换ListT a实际上需要组合两个函数:

虽然它很简单,但我很惊讶它还没有。

问题:

  • 有没有更好的方法来处理需要单子变压器的不确定性?
  • 是否有任何技术/库可以在列表和列表之间来回转换干净ListT

1确切的原因很复杂,所以我真的不想过多阐述。

0 投票
1 回答
168 浏览

haskell - 在将单子命令作为参数的函数中,支持单子转换器的最佳方法是什么?

假设我有一个计算

现在,假设我想写

然后,在实现foo时,我被迫“解开”它的论点,例如foo x = lift (foo (unlift x)). 这个unlift函数可能不适合单子计算。对于状态转换器,它将被迫忘记程序状态的任何变化。

似乎可以创建一个更通用的方法,该方法也采用提升函数,并导致计算t () -> t ()t提升(转换)单子在哪里。

问题。这是最好的方法吗?有没有更一般的东西可以写?CPS 风格的代码?谢谢!!

0 投票
1 回答
447 浏览

haskell - 如何很好地评估嵌套的 StateT 和 ErrorT monad?

对于程序中不同级别的控制结构,我有两种类型声明。底部是Agent, 一个StateT具有IO功能的。第二个是另一个StateTAgent能力的,第三个(Plan)是一个ErrorT

评估 a 的最佳方法是Plan什么?我写了下面的代码,但它不是很少,因为有很多嵌套runStateTrunErrorT调用。

有没有更简单/更好的东西?

0 投票
2 回答
1030 浏览

haskell - 如何在单子变压器内部分叉

考虑一些单子变压器堆栈,比如说

还有一些功能J

然后我发现自己在J上下文中。我可以写

J现在我想在上下文中的单独线程中查看和打印 quuxes

这显然行不通。我想有一些方法可以解决这样一个简单的问题,只是想不通。

0 投票
1 回答
344 浏览

haskell - 操作 monad 堆栈

如果我有一堆 monad,比如说IO, StateandError和一个只使用IOand的函数Error。如何State从堆栈中“删除”中间单子以便我可以使用我的函数?如果顺序是IO, Error, State,我可以使用它来匹配类型,但是如果 monad 堆栈包含并且可能以任何顺序包含其他 monad lift,我希望能够使用我的函数。例如:IOError

0 投票
2 回答
219 浏览

haskell - 仅在 monad 转换器中更新外部 monad

我有一个单子用于计算可能会失败并进行一些日志记录:

我有一个不会失败但会记录一些日志的功能:

使用 f2 的日志更新 f1 中的 writer monad 并捕获 f2 计算的输出的最佳方法是什么?目前我正在这样做:

我正在使用 lift 用不同的计算更新内部 monad,因此切换 Writer 和 Either monad 不会解决问题。

0 投票
1 回答
1330 浏览

haskell - 列出单子转换器

我需要使用列表单子变压器。ListT IO我读过from存在潜在问题Control.Monad.List,因为IO它不是可交换的,所以我正在查看ListT done right。但我得到了一些意想不到的行为。

考虑这个简单的测试:

使用 Control.Monad.List:

使用“ListT 做得对”:

这是“ListT 做得对”的问题,还是我只是用错了?有首选的替代方案吗?

谢谢!