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
s和do
s的组合创建的——除了So Q&正如,迪尔在这里总结得很好。
我也一直在使用transformers
库中的map<Monad>T
变体来获得一些有趣的结果,但我似乎找不到如何解决最初的问题。任何提示都将不胜感激——然而,如果你发布了一个解决方案,请使用扰流板标记(尽管我从未见过它在Puzzling之外的任何地方使用过)。
这个练习真正展示了monad转换器有时是如何"由内而外"工作的。首先要弄清楚如何包装这个表达式,这样你就可以得到类型的东西
ReaderT () IO (Either String (Maybe Int))
然后想办法得到MaybeT
。等等
不要忘记,您可以使用ReaderT
、EitherT
和MaybeT
数据构造函数!
如果你还没有尝试GHC的类型的孔,这将是一个很好的时机。