问题标签 [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 投票
3 回答
466 浏览

haskell - 处理置换的单子变压器堆栈

我发现 monad 转换器的问题之一是需要对lift正确的 monad 进行操作。一个lift在这里和那里都不错,但有时有些功能看起来像这样:

我希望能够编写这个函数:

这将 s 的数量减半lift,并使代码更清晰。

问题是:什么单子是monadInvert可能的?应该如何创建这个功能?

加分点:定义它monad mMonadIO.

这个问题的标题谈到了排列:确实,我们如何处理 monad 转换器堆栈的任意排列?

0 投票
3 回答
940 浏览

haskell - 用于进度跟踪的 Monad 转换器

我正在寻找可用于跟踪程序进度的 monad 转换器。要解释如何使用它,请考虑以下代码:

我意识到step由于一元定律,它必须明确存在,并且task由于程序确定性/停止问题,它必须具有明确的步数参数。

如我所见,上述 monad 可以通过以下两种方式之一实现:

  1. 通过将返回当前任务名称/步骤索引堆栈的函数,以及过程中在它停止的点处的继续。在返回的延续上重复调用此函数将完成过程的执行。
  2. 通过一个函数,该函数描述了当一个任务步骤完成时要做什么。该过程将不受控制地运行,直到完成,通过提供的操作“通知”环境有关更改。

对于解决方案 (1),我Control.Monad.Coroutine使用了Yield悬浮函子。对于解决方案 (2),我不知道有任何可用的单子转换器有用。

我正在寻找的解决方案不应该有太多的性能开销,并允许尽可能多地控制过程(例如不需要 IO 访问或其他东西)。

这些解决方案中的一个听起来可行吗,还是已经有其他解决方案可以解决这个问题?这个问题是否已经用我找不到的单子变压器解决了?

编辑:目标不是检查是否所有步骤都已执行。目标是能够在进程运行时“监控”进程,以便知道它已经完成了多少。

0 投票
2 回答
254 浏览

haskell - Haskell monads 和一个不需要字符串的失败

我有以下 monad 转换器来处理 Haskell 中的错误。

它工作得相当好,因为我可以Error使用自定义类进行实例化,并且有一种非常灵活的方式来处理错误。

fail不过,这有点傻,因为它是 type String -> EitherT e m,并且String限制可能是一种令人讨厌的创建错误的方式。我最终得到了很多:

我想做的是创建一个新函数,例如fail,它是类型a -> e,以便我可以删除(Error e)限制。fail当 monad 堆栈变大时特别方便,比如当我结束时

有没有办法创建一个fail与限制较少的类型具有相同行为的函数?或者是fail使用 deep haskell 暗魔法实现的?

0 投票
2 回答
355 浏览

haskell - 存在类型和单子变换器

上下文:我正在尝试生成一个错误单子,它还跟踪警告列表,如下所示:

ieDangerous a是导致(Either e a, [w])wheree是可显示的错误并且w是可显示的操作。

问题是,我似乎无法真正运行这个东西,主要是因为我不太了解存在类型。观察:

这不会编译,因为:

我迷路了。w1是什么?为什么我们不能推断它是~ w

0 投票
1 回答
192 浏览

haskell - 用 Operational Monad 实现的 Writer 不能懒惰地工作

我使用 Operational Monad 方法编写了一个具有 Writer 功能的 monad。然后我注意到它不能懒惰地工作。

在下面的代码中,有一个rogueWriter执行无限多个语句的语句,每个语句都写入一个字符串。程序不会终止,只需要无限输出的一些字符。

经过我的分析,我注意到流氓作家实际上非常友好(哈哈),因为当我从runMyWriter rogueWriter变为时runWriter rogueWriter,一切都很顺利。

问题:

  1. 如何最好地解释这种行为?
  2. 我应该如何更改我的代码以使其正常工作?
  3. 什么单子变压器分别SomeMonadT出现了同样的问题
    SomeMonadT Writer wWriterT w SomeMonad (也许有一些例子?)

编辑:我是否有可能在这里尝试反转无限字符串?Sjoerd Visscher 的解决方案与我的解决方案之间的显着区别是

代码:

0 投票
1 回答
2904 浏览

haskell - 如何将 Maybe 值注入 MaybeT

假设我有一些foo :: Maybe Int并且我想将它与例如绑定bar :: Int -> MaybeT (Writer String) Int,那么惯用的方法是什么?

我可以定义自己的liftMaybe函数,然后使用它,例如:

但是有没有更惯用(或至少简洁)的方式来做到这一点?

0 投票
1 回答
414 浏览

haskell - monad 转换器内部的 monad 结果

这是我第一次认识 Monad Transformers,所以答案可能很明显。

假设我在 StateT MyMonad MyType 类型的 do 块内,我想让另一个相同类型的函数既修改状态又返回 MyMonad MyType 类型的值。我怎样才能做到这一点?我认为这里的示例在guessSession中显示了它,但我似乎无法理解如何应用它!

0 投票
1 回答
810 浏览

haskell - 当两个单子都没有变压器时合并两个单子?

我正在玩写一个网络应用程序。在这种情况下,我使用scottyredis,但是这个问题出现在任何 web/db 组合中。在此之前我使用了 happstack,所以我也喜欢那里的一个例子。

Scotty 让您在嵌套的 monad 中定义路由,这使得访问路由中的数据库连接变得容易:

get 中的 do 块具有类型:Web.Scotty.ActionM (). 所有 redis 命令都有 type Database.Redis.Redis a。redis 或 scotty 都没有单子转换器。

将这些结合起来的最佳方法是什么?我是haskell 的新手,但我确实设法让ReaderT 与happstack 中的web monad 一起工作。

理想情况下,我可以以某种方式创建一个新的 monad 堆栈,该堆栈支持两者keyshtml在同一个 do 块中。

0 投票
2 回答
8770 浏览

haskell - 使用单子变压器避免升力

我有一个问题,一堆单子变压器(甚至一个单子变压器)在上面IO。一切都很好,除了在每个动作之前使用提升非常烦人!我怀疑这真的没什么可做的,但我想我还是会问。

我知道提升整个块,但如果代码真的是混合类型怎么办?如果 GHC 加入一些语法糖(例如<-$= <- lift)会不会很好?

0 投票
2 回答
517 浏览

haskell - haskell 中不同的、交互的状态级别

我正在模拟一个 4 位微处理器。我需要跟踪寄存器、内存和运行输出(还有一个获取执行周期计数器的奖励点)。我已经设法在没有单子的情况下做到了这一点,但是一次明确地传递这么多东西感觉很混乱。此外,函数定义混乱、冗长且难以阅读。

我试图用 monads 做到这一点,但它不适合在一起。我尝试将所有单独的状态组件视为单一类型,但这给我留下了如何创建值的问题。

是唯一有意义的类型。但在这一点上,为什么还要打扰呢?我尝试通过将字符串从复合类型中拉出并将其视为值来分解它

效果很好,除了我需要 RUNNING 输出。无论我做什么,我都无法同时抓住字符串和状态。

现在我正在努力解决单子变压器。似乎我必须分离出所有不同级别的状态。但我的头快要爆炸了。

我什至还没有放入 FEcycle 计数器呢!

问题:

  1. 我在正确的轨道上吗?
  2. 看到我现在正在拔出单子变压器,是否可以停止将“运行输出”视为状态并将其交给 IO 单子?那太棒了,我可以打印它,而不是坚持它。
  3. 我应该将状态分为多少层?我可以看到两个不同的层,但它们彼此密切相关(内存和寄存器都取决于内存和寄存器的状态)。我应该将它们作为一个单一的状态保持在一起还是将它们分开并堆叠起来?哪种方法会产生最易读的代码?