问题标签 [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 - Haskell 提前退出状态单子(守卫?)
我有一个代表我的应用程序游戏状态的类型,对于这个问题,假设它很简单,例如:
我用 State monad 定义我的游戏逻辑。
我希望能够简单地丢弃一些输入
我想要一个看起来像这样的语法
如果它击中守卫,我希望它独自离开状态,并且在 block 中什么也不做。
我该怎么做?使用 MonadPlus似乎很接近可能,但我不确定我是否可以使用 mzero 来表示“返回你已经拥有的状态”。谢谢!
haskell - 使用 ReaderT 创建可修改的环境
我一直在关注并扩展教程Write Yourself A Scheme。我有一种LispVal
包裹在几层单子变压器中的类型:
using 的想法ReaderT
是,我将能够通过评估器自动传递环境(它维护变量绑定),并且它的使用位置很明显,因为将调用ask
. 这似乎比将环境作为额外参数显式传递更可取。当我开始实现延续时,我会想用ContT
monad 转换器做一个类似的技巧,并避免为延续传递额外的参数。
但是,我还没有弄清楚如何通过这样做来修改环境。例如,定义一个新变量或设置一个旧变量的值。
举一个具体的例子,假设每当我评估一个 if 语句时,我想将变量绑定it
到 test 子句的结果。我的第一个想法是直接修改环境:
这truthVal
是一个将 a 分配Bool
给 any的函数LispVal
。但我不知道如何编写函数bind
以修改环境。
我的第二个想法是使用local
:
但是这里bind
需要有 type Env -> Env
,而且由于我IORef
在环境中使用 s 作为值,所以我只能写一个带有签名的函数Env -> IO Env
。
这甚至可能吗,还是我需要使用StateT
而不是ReaderT
?
haskell - 为什么不能将 ContT 设为 MonadError 的实例?
我有一个单子变压器堆栈,包括一个ErrorT
,我想ContT r
在整个东西周围包裹一个变压器。当我尝试这样做时,我对throwError
生成类型错误的调用 - 显然ContT r
不会自动成为MonadError
. 好吧,我想——我就把它变成一个:
使用一些合适的定义liftCatch
。但是现在编译时出现错误:
我很高兴使用 UndecidableInstances 杂注(我的印象不是太令人担忧,例如看到这个问题)但我想知道将延续转换器变成一个实例是否有困难MonadError
- 我想如果它是好吧,这个包的作者Control.Monad.Trans
早就做了……对吧?
scala - 我可以使用 monad 转换器来简化这个组合吗?
假设我有
我想得到类型的结果,VS[Option[B]]
但如果v
是 a Success(None)
,结果也应该是 a Success(None)
。这是一个例子:
然后:
成功案例是:
空壳是:
有没有“更好”的方式来做到这一点(可能涉及 kleisli 组合或单子变换器)?
haskell - 重复调用 Haskell monad
我有一个返回 monad 的 Haskell 函数,声明如下:
此函数玩单人纸牌游戏,然后返回一个指示输赢的布尔值,以及WriterT
monad 中的日志。
我想调用这个函数一定次数,每次都使用随机生成器(StdGen
)的“下一个”值,并将Bool
返回值连接到一个列表中。
我尝试创建一个递归函数来执行调用,但无法弄清楚如何将 monad 传递到下一次迭代中。
我想效仿
并收集所有结果Bool
值,以及来自WriterT
monad 的日志条目。
做这个的最好方式是什么?
f# - 如何在 F# 中组合状态和延续单子
我正在尝试使用任务并行库对树求和,其中子任务仅在遍历树直到一定深度之前才产生,否则它使用连续传递样式对剩余的子节点求和,以避免堆栈溢出。
然而,代码看起来很丑 - 使用状态单子来携带当前深度会很好,但状态单子不是尾递归的。或者,我将如何修改延续单子以携带状态?或者创建状态和延续单子的组合?
我在这篇博文中有更多细节:http: //taumuon-jabuka.blogspot.co.uk/2012/06/more-playing-with-monads.html
haskell - 正确的混叠控制单子
我有一个返回用户 ID 的单子函数:
我需要能够在 getUserId 上“叠加”一个函数,该函数查找并返回 getUserId 返回的值的别名
显然,我可以编写一个特定的函数 getAlias 并重写 monad 本身:
但是我觉得这可以通过将 getAlias 隐藏在 monad 的绑定函数中来更普遍、可重用和不可见地完成。
Monad Transformers 是否执行此功能,即将内部 monad 的绑定函数与外部 monad 的绑定函数组合在一起?或者我需要一些其他的控制结构吗?
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 代码,并在它最终在我脑海中运行时写一些关于它的东西。
haskell - 在 Pipes-2.1.0 包中完成
我正在使用 Pipes-2.1.0 包和 zeromq3-haskell 包来构建一个小消息管道。除了我无法理解 Frames 的最终确定之外,一切似乎都进展顺利。
在接下来的框架中,我获得了两个资源;zeromq 上下文和 zeromq 套接字。然后我不断地等待消息(以 的形式ByteStrings
)在 zeromq 套接字上发布。
现在如果我试试这个:
我明白了:
publisher
收到后完成,但一个BytesString
。
为什么会这样?
我对在 Pipes-2.1.0 中使用 Frames 进行最终确定有什么误解?
如果我开始攻击外面的树,它还有机会吗?