问题标签 [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 中理解 $
我很难理解以下代码(在 IO 之上的 ErrorT monad 中执行):
>>
的优先级高于$
。那么是Bool True
首先包裹在 IO 中,然后是先提升liftIO
还是hClose
先提升?换句话说,是在 IO monad 还是在 ErrorT monad 中执行>>
?return
haskell - 使自定义 monad 转换器成为 MonadError 的实例
我想让我的 monad 转换器成为一个实例,MonadError
如果转换后的 monad 是一个实例。基本上我希望我的变压器表现得像内置变压器一样,例如有一个MonadError
实例StateT
:
我试过这样做:
但是 GHC 开始抱怨 undecidable 实例,显然 MTL 库只是启用了 undecidable 实例,但是有什么办法可以避免这种情况呢?还是在这种情况下没问题,不会造成任何问题?
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 有更多经验的人那里得到一些提示。
谢谢。
haskell - 将错误值提升到 ErrorT monad 转换器
我认为我缺少对 monad 转换器的一些基本了解,因为我发现自己正在编写以下代码:
虽然这可行,但我认为这可以更优雅地完成。特别是,我正在寻找 的替代品liftError
,我认为我不应该为自己定义。
在不改变类型的情况下,最直接的制作gateway
和inner
合作方式是什么?
haskell - “使用功能依赖进行组合时无法匹配类型”错误是什么意思?
我目前正在为我正在学习的课程编写一个小型编译器。所以我开始编写这个 monad 转换器来处理类型检查,但得到了一个非常神秘的类型错误。涉及功能依赖的东西,我不太了解。可以重现错误的程序的一小段摘录:
而实际消息:
python - 结合可能和 seq 单子:在输出中感到困惑
我正在尝试编写 seq-m 和 error-m 来对可能返回错误的事物进行列表理解。我的输出有意想不到的类型,尽管除此之外它实际上似乎是明智的。我已经在下面分解了我的代码,但这里也是一个工作要点。
这是我的一元业务逻辑
输出
我希望看到元组列表 - 该列表是列表理解的结果,最终列表中的每个项目都应该是错误单子(value, error
元组)中的一个值。就像删除了太多的嵌套级别一样seq_bind
。
这是我对 monad 的定义,如果它不正确,那么它非常接近,因为两个 monad 都是孤立地工作的,而不是结合起来的。
一元API
也在寻找改进代码的方法。标记 haskell 和 clojure 因为这是这些语言的惯用语,python 社区对此不感兴趣。
haskell - 如何正确地将 IO 添加到 attoparsec 解析器?
我想在我的 attoparsec 解析器中进行一些跟踪/调试。这是最小的 [not] 工作示例:
为了在解析器中使用 IO 操作,我必须做什么?
haskell - 小型命令式语言的解释器
嗨,我正在用 Haskell 编写类似 C 的静态类型语言的解释器。我想在执行代码之前执行类型检查,但是我遇到了一些问题。首先,下面有一些来自我的抽象语法的类型定义:
TCM 用于报告错误和传递环境,例如:
现在我想检查表达式的类型,所以我有以下执行检查的函数:
它适用于所有情况,但一种情况除外:
我被困在这里。我认为我应该做的是检查 f 的类型(我的意思是首先检查它是否真的是一个函数)并查看 f 定义中记录的参数类型是否与实际传递的参数类型匹配。不幸的是,我是一个 haskell 新手,不知道如何以正确的方式表达它。任何建议将不胜感激:)
编辑:好的,我之前在这里写的内容可能没有暗示,但 EFuncWithParams Ident [Exp] 实际上是一个函数调用(是的,我知道这有点误导),我希望能够调用像 f(2 + 3, a, b[0]) 这就是我使用 TFunction [Exp] 的原因。函数声明和定义是一条语句,定义如下:
声明者在哪里:
参数声明是 Type_specifiers 和 Idents 的列表
我认为我应该做的是在检查其声明时将函数类型保存在地图中,然后在此处获取它。我的意思是我也有:
问题是我有一个用于类型检查语句的单独函数,我怀疑一个函数(例如 typeof_stm)使用的映射是否自动传递给另一个函数(例如 typeof)。我认为这不会发生,但也许我错了。
haskell - 暂停单子
Monads 可以做许多令人惊奇、疯狂的事情。他们可以创建包含值叠加的变量。它们可以让您在计算之前访问未来的数据。它们可以让你编写破坏性的更新,但不是真的。然后延续单子让你打破人们的想法!通常是你自己的。;-)
但这里有一个挑战:你能制作一个可以暂停的 monad吗?
Pause
monad 是一种状态 monad(因此,mutate
具有明显的语义)。通常,像这样的 monad 具有某种“运行”功能,它运行计算并将最终状态返回给您。但Pause
不同的是:它提供了一个step
函数,该函数运行计算,直到它调用神奇的yield
函数。此处计算暂停,向调用者返回足够的信息以便稍后恢复计算。
对于额外的 awesomness:允许调用者修改step
调用之间的状态。(例如,上面的类型签名应该允许这样做。)
用例:编写执行复杂操作的代码通常很容易,但需要一个完整的 PITA 来将其转换为还输出其操作中的中间状态。如果您希望用户能够在执行过程中更改某些内容,那么事情会变得非常复杂。
实施思路:
显然,它可以通过线程、锁和
IO
. 但我们能做得更好吗?;-)延续单子有些疯狂吗?
也许是某种 writer monad,
yield
只记录当前状态,然后我们可以step
通过迭代日志中的状态来“假装”它。(显然这排除了改变步骤之间的状态,因为我们现在并没有真正“暂停”任何东西。)
haskell - 将 MonadReader/MonadError 实例添加到 Transformer 类型
与使用 Happstack 时通常一样,我一直在制作自己的服务器 monad 用于处理程序,以涵盖我的数据库和会话,以及一些错误处理。我最近发现happstack-clientsession
-Package 有很大帮助,它阻止我编写自己的解决方案。
ClientSessionT
虽然在我自己的单子中接线有点麻烦。事实证明,它没有MonadReader
orMonadError
实例,所以我不能在我的包装器 monad 中实例化它们。
这是模块的完整代码:
我得到的错误很明显:源自MonadError
并且MonadReader
不起作用。但我需要那些,否则整个表演有点没用。
由于我一直无法弄清楚这些是如何完成的(并且依赖于deriving
),我想要一个涵盖这个特定问题的答案,并告诉我它是如何完成的。