请帮助我理解内外单子的概念

时间:2012-03-24 17:12:20

标签: haskell monads

我还不是monad-jedi,但我对它们有基本的了解。

现在我读了一些提到'内部'和'外部'monad的文章,我想知道这意味着什么。

(链接到)代码示例会很有帮助。

谢谢!

1 个答案:

答案 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

此处,StateTmtl包中定义,与State类似,只是为其中的另一个monad留下了一个位置。通过使用像这样的monad变换器,你可以以零碎的方式组合来自几个monad的效果。

在这种情况下,Maybe是内部monad,StateT s Maybe是外部monad。您可以使用lift类型类中的MonadTrans从内部monad到外部monad。