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

Haskell 请帮助我理解内单子和外单子的概念,haskell,monads,Haskell,Monads,我还不是单子绝地武士,但我对他们有基本的了解 现在我读到一些文章提到“内在”和“外在”单子,我想知道这是什么意思 (链接到)代码示例将很有帮助 谢谢 许多Haskell应用程序使用monad Transformer,这是类型类的实例 class MonadTrans t where lift :: Monad m => m a -> t m a 这样做的目的是通过将多个monad封装在一起,来组合多个monad提供的环境。例如,states smonad使您能够对类型为s的

我还不是单子绝地武士,但我对他们有基本的了解

现在我读到一些文章提到“内在”和“外在”单子,我想知道这是什么意思

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


谢谢

许多Haskell应用程序使用monad Transformer,这是类型类的实例

class MonadTrans t where
    lift :: Monad m => m a -> t m a
这样做的目的是通过将多个monad封装在一起,来组合多个monad提供的环境。例如,
states s
monad使您能够对类型为
s
的状态进行操作,该状态会自动贯穿您的计算,而
Maybe
monad则允许您短路故障。但如果您想要这两种效果,则可以使用这两种效果之一的monad transformer版本来组合它们,例如:

something :: StateT s Maybe a
在这里,
StateT
是在
mtl
包中定义的,与
State
类似,只是为位于其中的另一个monad留出了一个位置。通过使用这样的单子变形器,您可以以零碎的方式合成多个单子的效果


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

您省略了
StateT
的state-type参数;它应该是
something::StateT Foo Maybe a
其中
StateT Foo Maybe
是外部单子。请链接到这些文章。否则,您的问题未指定。