haskell - 将嵌套类型转换为 monad 转换器堆栈

标签 haskell nested monads monad-transformers

我在 Haskell Programming From First Principles 的 Monad Transformers 章节中的一个练习中遇到了一些问题。具体来说,我们得到一个类似于 (const (Right (Just 1))) 的结构。并被要求完成以下任务:

import Control.Monad.Trans.Except
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Reader

embedded :: MaybeT (ExceptT String (ReaderT () IO)) Int
embedded = ??? (const (Right (Just 1)))

我认为这意味着我们无法更改嵌套结构,尽管说明只是“使其工作”。

在得出我被困住的结论之前,我已经走了几条路。到目前为止,据我所知,monad 转换器最常由 lift 的组合创建。和 do s — 除了 SO 问答之外,Diehl summarizes pretty well here

我也一直在与 map<Monad>T 合作transformers 的变体库来获得一些有趣/有趣的结果,但我似乎无法找出如何解决原来的问题。任何提示将不胜感激 - 但是,如果您发布解决方案,please use the spoiler markup (尽管我从未见过它在 Puzzling 以外的任何地方使用过)。

最佳答案

这个练习确实展示了 monad 转换器有时如何“由内而外”地工作。首先弄清楚如何包装该表达式,以便获得某种类型的内容

ReaderT () IO (Either String (Maybe Int))

然后弄清楚如何获得MaybeT。等等

不要忘记您可以使用 ReaderTEitherTMaybeT 数据构造函数!

如果您还没有尝试过 GHC 的键入漏洞,这将是一个很好的时机。

关于haskell - 将嵌套类型转换为 monad 转换器堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36242906/

相关文章:

scala - Scala 中的 'yield' 是否等同于 map 函数?

python - 如何拆分嵌套列表的定义元素

python - 从 Python 中的嵌套子类访问父变量

css - 从一个自定义标签生成多个 html 标签

unit-testing - 我如何对 Alex 代码进行单元测试?

Haskell - 如何避免一遍又一遍地输入相同的上下文?

haskell - Control.Category,>>>和<<<是什么意思?

haskell - haskell 中的文件夹映射类型是什么?

haskell - Haskell 程序员的计算表达式

scala - 在 Scala 中创建一个任意类作为 monad 实例