我在 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
。等等
不要忘记您可以使用 ReaderT
、EitherT
和 MaybeT
数据构造函数!
如果您还没有尝试过 GHC 的键入漏洞,这将是一个很好的时机。
关于haskell - 将嵌套类型转换为 monad 转换器堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36242906/