gpt4 book ai didi

haskell - 使用 Monad 变压器避免提升

转载 作者:行者123 更新时间:2023-12-03 06:07:07 27 4
gpt4 key购买 nike

我有一个问题,一堆 monad 变压器(甚至一个 monad 变压器)超过 IO 。一切都很好,除了在每个 Action 之前使用电梯非常烦人!我怀疑确实没有什么可做的,但我想我还是会问。

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

最佳答案

对于所有标准mtl monads,你不需要lift根本不。 get , put , ask , tell — 它们都可以在任何 monad 中工作,并在堆栈中的某个位置使用正确的变压器。缺失的部分是 IO ,甚至还有liftIO将任意 IO 操作提升至任意数量的层。

这是通过提供的每个“效果”的类型类来完成的:例如, MonadState 提供getput 。如果您想创建自己的 newtype变压器堆栈的包装器,你可以这样做 deriving (..., MonadState MyState, ...)GeneralizedNewtypeDeriving扩展,或推出您自己的实例:

instance MonadState MyState MyMonad where
get = MyMonad get
put s = MyMonad (put s)

您可以通过定义一些实例而不是其他实例,使用它来有选择地公开或隐藏组合变压器的组件。

(通过定义自己的类型类并为标准转换器提供样板实例,您可以轻松地将这种方法扩展到您自己定义的全新单子(monad)效果,但全新的单子(monad)很少见;大多数时候,您将只需编写 mtl 提供的标准集即可获得。)

关于haskell - 使用 Monad 变压器避免提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9054731/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com