问题标签 [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.
haskell - IdentityT 转换器的目的是什么?
在查看 transformers 包时,我发现了这个名为IdentityT的 monad 转换器。
尽管我了解 Identity monad 的使用方式(例如State
只是 的别名StateT Identity
)以及 monad 转换器的一般工作方式,但我不知道这与IdentityT
.
由于它不在 MTL 中,我猜它只是为了完整性而添加在那里并且没有实际用途。那是对的吗?
haskell - 如何将 monad-control 用于 ReaderT 上的简单新类型包装器
我已经定义了一个简单的 monad 转换器,EntityBuilderT
它只是一个 newtype over ReaderT
。
为了将函数包装在新的“环境”中,我编写了以下组合器:
在某些情况下,我还想构建一个更大的变压器堆栈。例如:
显然,我不能应用withNewSource
这个函数f
,因为 monad 类型不再匹配。因此,我尝试使用monad-control
这种组合器来编写新版本。
到目前为止,我编写的代码如下所示。尽管实例定义似乎没问题,但编译器 (GHC 7.4.1) 拒绝代码并显示以下消息:
我有些失落。任何人都明白真正的问题是什么?
parsing - 使正常的单子函数与单子变换器等效
我正在尝试解决平衡括号问题。我不想做连续的 IO,而宁愿只调用一次 getLine 并解析结果字符串。因此,解决问题的函数将处理两种不同的状态:输入字符串的未使用部分和括号堆栈。
我想设置一些函数来操作堆栈:
如果我在 state monad 中操作,那一切都很好,但是我在 StateT monad 中操作
我知道我被告知不要在堆栈中有重复的单子。我这样做是因为我喜欢它简化 push 和 pop 定义的方式。
两个问题:
- 无论我做什么,我都找不到将推送和弹出应用到 StateT 中包含的堆栈的方法。
- 我不知道如何从主函数调用它
这是其余的代码
list - 如何在列表和 ListT monad 转换器之间干净地转换?
我目前正在编写一个项目,我大量使用了ListT
monad 转换器。使用普通列表时,实现非确定性非常容易。但是,一旦我不得不将我的代码转换为1ListT
,它就会变得更加复杂。
举个简单的例子:从[a]
到转换ListT a
实际上需要组合两个函数:
虽然它很简单,但我很惊讶它还没有。
问题:
- 有没有更好的方法来处理需要单子变压器的不确定性?
- 是否有任何技术/库可以在列表和列表之间来回转换干净
ListT
?
1确切的原因很复杂,所以我真的不想过多阐述。
haskell - 在将单子命令作为参数的函数中,支持单子转换器的最佳方法是什么?
假设我有一个计算
现在,假设我想写
然后,在实现foo
时,我被迫“解开”它的论点,例如foo x = lift (foo (unlift x))
. 这个unlift
函数可能不适合单子计算。对于状态转换器,它将被迫忘记程序状态的任何变化。
似乎可以创建一个更通用的方法,该方法也采用提升函数,并导致计算t () -> t ()
,t
提升(转换)单子在哪里。
问题。这是最好的方法吗?有没有更一般的东西可以写?CPS 风格的代码?谢谢!!
haskell - 如何很好地评估嵌套的 StateT 和 ErrorT monad?
对于程序中不同级别的控制结构,我有两种类型声明。底部是Agent
, 一个StateT
具有IO
功能的。第二个是另一个StateT
有Agent
能力的,第三个(Plan
)是一个ErrorT
。
评估 a 的最佳方法是Plan
什么?我写了下面的代码,但它不是很少,因为有很多嵌套runStateT
和runErrorT
调用。
有没有更简单/更好的东西?
haskell - 如何在单子变压器内部分叉
考虑一些单子变压器堆栈,比如说
还有一些功能J
:
然后我发现自己在J
上下文中。我可以写
J
现在我想在上下文中的单独线程中查看和打印 quuxes
这显然行不通。我想有一些方法可以解决这样一个简单的问题,只是想不通。
haskell - 操作 monad 堆栈
如果我有一堆 monad,比如说IO
, State
andError
和一个只使用IO
and的函数Error
。如何State
从堆栈中“删除”中间单子以便我可以使用我的函数?如果顺序是IO
, Error
, State
,我可以使用它来匹配类型,但是如果 monad 堆栈包含并且可能以任何顺序包含其他 monad lift
,我希望能够使用我的函数。例如:IO
Error
haskell - 仅在 monad 转换器中更新外部 monad
我有一个单子用于计算可能会失败并进行一些日志记录:
我有一个不会失败但会记录一些日志的功能:
使用 f2 的日志更新 f1 中的 writer monad 并捕获 f2 计算的输出的最佳方法是什么?目前我正在这样做:
我正在使用 lift 用不同的计算更新内部 monad,因此切换 Writer 和 Either monad 不会解决问题。
haskell - 列出单子转换器
我需要使用列表单子变压器。ListT IO
我读过from存在潜在问题Control.Monad.List
,因为IO
它不是可交换的,所以我正在查看ListT done right。但我得到了一些意想不到的行为。
考虑这个简单的测试:
使用 Control.Monad.List:
使用“ListT 做得对”:
这是“ListT 做得对”的问题,还是我只是用错了?有首选的替代方案吗?
谢谢!