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



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转换器最常见的是由lifts和dos的组合创建的——除了So Q&正如,迪尔在这里总结得很好。

我也一直在使用transformers库中的map<Monad>T变体来获得一些有趣的结果,但我似乎找不到如何解决最初的问题。任何提示都将不胜感激——然而,如果你发布了一个解决方案,请使用扰流板标记(尽管我从未见过它在Puzzling之外的任何地方使用过)。

这个练习真正展示了monad转换器有时是如何"由内而外"工作的。首先要弄清楚如何包装这个表达式,这样你就可以得到类型的东西

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

然后想办法得到MaybeT。等等

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

如果你还没有尝试GHC的类型的孔,这将是一个很好的时机。

最新更新