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