我还不是monad-jedi,但我对它们有基本的了解。
现在我读了一些提到'内部'和'外部'monad的文章,我想知道这意味着什么。
(链接到)代码示例会很有帮助。
谢谢!
答案 0 :(得分:19)
许多Haskell应用程序使用monad转换器,它们是类型
的实例class MonadTrans t where
lift :: Monad m => m a -> t m a
这样做可以让你将几个monad提供的环境结合在一起。例如,State s
monad使您能够对类型s
的状态进行操作,该状态会自动进行计算,而Maybe
monad可以让您发生短路故障。但是如果你想要这两种效果的,那么你可以使用两者之一的monad变换器版本来组合它们,例如:
something :: StateT s Maybe a
此处,StateT
在mtl
包中定义,与State
类似,只是为其中的另一个monad留下了一个位置。通过使用像这样的monad变换器,你可以以零碎的方式组合来自几个monad的效果。
在这种情况下,Maybe
是内部monad,StateT s Maybe
是外部monad。您可以使用lift
类型类中的MonadTrans
从内部monad到外部monad。