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

Haskell 将嵌套类型转换为monad转换器堆栈,haskell,nested,monads,monad-transformers,Haskell,Nested,Monads,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))
的结构,并被要求完成以下工作:

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 Transformer最常见的创建方式是使用
lift
s和
do
s的组合-除了所谓的Q&a


我还一直在使用
transformers
库中的
mapT
变体,以获得一些有趣的结果,但我似乎无法找到如何解决原始问题的方法。任何提示都将不胜感激——不过,如果您发布了一个解决方案(尽管我从未见过它在任何地方使用过,除了在Puzzling中)。

这个练习确实展示了monad transformers有时是如何“由内而外”工作的。首先要弄清楚如何包装这个表达式,这样就可以得到某种类型的东西

ReaderT () IO (Either String (Maybe Int))
然后找出如何获得
MaybeT
。等等

不要忘记,您可以使用
ReaderT
EitherT
MaybeT
数据构造函数


这将是一个伟大的时间来尝试GHC的键入孔,如果你还没有。

Gah-这是简单的,因为我认为这将是。谢谢你的提示@斯提斯,没问题!