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

haskell - 在 Haskell 中理解 $

我很难理解以下代码(在 IO 之上的 ErrorT monad 中执行):

>>的优先级高于$。那么是Bool True首先包裹在 IO 中,然后是先提升liftIO还是hClose先提升?换句话说,是在 IO monad 还是在 ErrorT monad 中执行>>return

0 投票
1 回答
335 浏览

haskell - 使自定义 monad 转换器成为 MonadError 的实例

我想让我的 monad 转换器成为一个实例,MonadError如果转换后的 monad 是一个实例。基本上我希望我的变压器表现得像内置变压器一样,例如有一个MonadError实例StateT

我试过这样做:

但是 GHC 开始抱怨 undecidable 实例,显然 MTL 库只是启用了 undecidable 实例,但是有什么办法可以避免这种情况呢?还是在这种情况下没问题,不会造成任何问题?

0 投票
1 回答
162 浏览

haskell - 使用 Reader 扩展 ServerPartT Monad

我正在编写一个 Happstack 服务器,并且我有一个 MongoDB 数据库要连接。为此,我做了一个函数来创建一个连接池

Action然后是一个使用创建的池运行的函数:

很明显,这需要将pool所有路由作为参数携带。我想将它包装成一个ReaderT,这样它就runDB可以有一个类似Action IO a -> ServerPart (Either Failure a)甚至更好的类型,Action IO a -> ServerPart a其中失败将自动导致 HTTP 错误 500。

我很难理解如何实现这一点,我很想从对 Haskell monads 和 happstack 有更多经验的人那里得到一些提示。

谢谢。

0 投票
1 回答
409 浏览

haskell - 将错误值提升到 ErrorT monad 转换器

我认为我缺少对 monad 转换器的一些基本了解,因为我发现自己正在编写以下代码:

虽然这可行,但我认为这可以更优雅地完成。特别是,我正在寻找 的替代品liftError,我认为我不应该为自己定义。

在不改变类型的情况下,最直接的制作gatewayinner合作方式是什么?

0 投票
1 回答
481 浏览

haskell - “使用功能依赖进行组合时无法匹配类型”错误是什么意思?

我目前正在为我正在学习的课程编写一个小型编译器。所以我开始编写这个 monad 转换器来处理类型检查,但得到了一个非常神秘的类型错误。涉及功能依赖的东西,我不太了解。可以重现错误的程序的一小段摘录:

而实际消息:

0 投票
3 回答
1899 浏览

python - 结合可能和 seq 单子:在输出中感到困惑

我正在尝试编写 seq-m 和 error-m 来对可能返回错误的事物进行列表理解。我的输出有意想不到的类型,尽管除此之外它实际上似乎是明智的。我已经在下面分解了我的代码,但这里也是一个工作要点

这是我的一元业务逻辑

输出

我希望看到元组列表 - 该列表是列表理解的结果,最终列表中的每个项目都应该是错误单子(value, error元组)中的一个值。就像删除了太多的嵌套级别一样seq_bind

这是我对 monad 的定义,如果它不正确,那么它非常接近,因为两个 monad 都是孤立地工作的,而不是结合起来的。

一元API

也在寻找改进代码的方法。标记 haskell 和 clojure 因为这是这些语言的惯用语,python 社区对此不感兴趣。

0 投票
1 回答
773 浏览

haskell - 如何正确地将 IO 添加到 attoparsec 解析器?

我想在我的 attoparsec 解析器中进行一些跟踪/调试。这是最小的 [not] 工作示例:

为了在解析器中使用 IO 操作,我必须做什么?

0 投票
3 回答
602 浏览

haskell - 小型命令式语言的解释器

嗨,我正在用 Haskell 编写类似 C 的静态类型语言的解释器。我想在执行代码之前执行类型检查,但是我遇到了一些问题。首先,下面有一些来自我的抽象语法的类型定义:

TCM 用于报告错误和传递环境,例如:

现在我想检查表达式的类型,所以我有以下执行检查的函数:

它适用于所有情况,但一种情况除外:

我被困在这里。我认为我应该做的是检查 f 的类型(我的意思是首先检查它是否真的是一个函数)并查看 f 定义中记录的参数类型是否与实际传递的参数类型匹配。不幸的是,我是一个 haskell 新手,不知道如何以正确的方式表达它。任何建议将不胜感激:)

编辑:好的,我之前在这里写的内容可能没有暗示,但 EFuncWithParams Ident [Exp] 实际上是一个函数调用(是的,我知道这有点误导),我希望能够调用像 f(2 + 3, a, b[0]) 这就是我使用 TFunction [Exp] 的原因。函数声明和定义是一条语句,定义如下:

声明者在哪里:

参数声明是 Type_specifiers 和 Idents 的列表

我认为我应该做的是在检查其声明时将函数类型保存在地图中,然后在此处获取它。我的意思是我也有:

问题是我有一个用于类型检查语句的单独函数,我怀疑一个函数(例如 typeof_stm)使用的映射是否自动传递给另一个函数(例如 typeof)。我认为这不会发生,但也许我错了。

0 投票
6 回答
6037 浏览

haskell - 暂停单子

Monads 可以做许多令人惊奇、疯狂的事情。他们可以创建包含值叠加的变量。它们可以让您在计算之前访问未来的数据。它们可以让你编写破坏性的更新,但不是真的。然后延续单子让你打破人们的想法!通常是你自己的。;-)

但这里有一个挑战:你能制作一个可以暂停的 monad吗?

Pausemonad 是一种状态 monad(因此,mutate具有明显的语义)。通常,像这样的 monad 具有某种“运行”功能,它运行计算并将最终状态返回给您。但Pause不同的是:它提供了一个step函数,该函数运行计算,直到它调用神奇的yield函数。此处计算暂停,向调用者返回足够的信息以便稍后恢复计算。

对于额外的 awesomne​​ss:允许调用者修改step调用之间的状态。(例如,上面的类型签名应该允许这样做。)


用例:编写执行复杂操作的代码通常很容易,但需要一个完整的 PITA 来将其转换为还输出其操作中的中间状态。如果您希望用户能够在执行过程中更改某些内容,那么事情会变得非常复杂。

实施思路:

  • 显然,它可以通过线程、锁和IO. 但我们能做得更好吗?;-)

  • 延续单子有些疯狂吗?

  • 也许是某种 writer monad,yield只记录当前状态,然后我们可以step通过迭代日志中的状态来“假装”它。(显然这排除了改变步骤之间的状态,因为我们现在并没有真正“暂停”任何东西。)

0 投票
2 回答
835 浏览

haskell - 将 MonadReader/MonadError 实例添加到 Transformer 类型

与使用 Happstack 时通常一样,我一直在制作自己的服务器 monad 用于处理程序,以涵盖我的数据库和会话,以及一些错误处理。我最近发现happstack-clientsession-Package 有很大帮助,它阻止我编写自己的解决方案。

ClientSessionT虽然在我自己的单子中接线有点麻烦。事实证明,它没有MonadReaderorMonadError实例,所以我不能在我的包装器 monad 中实例化它们。

这是模块的完整代码:

我得到的错误很明显:源自MonadError并且MonadReader不起作用。但我需要那些,否则整个表演有点没用。

由于我一直无法弄清楚这些是如何完成的(并且依赖于deriving),我想要一个涵盖这个特定问题的答案,并告诉我它是如何完成的。