Haskell Monad变压器和提升功能
为什么除了IO之外,在内部monad transformer环境中执行函数时不需要使用lift?我的意思是,如果我有StateT超过WriterT,WriterT超过ReaderT,为什么我可以这样做Haskell Monad变压器和提升功能,haskell,monad-transformers,Haskell,Monad Transformers,为什么除了IO之外,在内部monad transformer环境中执行函数时不需要使用lift?我的意思是,如果我有StateT超过WriterT,WriterT超过ReaderT,为什么我可以这样做 tell $ {- any code here for the Writer -} foo <- asks {- This for the reader -} and so on... 有没有特别的解释,或者这只是Monad Transformers的编写方式 这是因为Monad Tran
tell $ {- any code here for the Writer -}
foo <- asks {- This for the reader -}
and so on...
有没有特别的解释,或者这只是Monad Transformers的编写方式 这是因为Monad Transformer Library(MTL)认识到以这种方式堆叠Monad是很常见的,因此它们不会将
告诉定义为某个函数(Mondoid w)=>w->Writer()
相反,它们有一个类型类,定义为一个类型类,其中包含tell函数。然后,它们定义了大量的MonadWriter
:ReaderT
、IO
、Writer
(duh)等实例,从而避免了lift的烦人重复。
这是很常见的,任何monad转换器(在MTL中)都会有一个控件.monad.**.Class
,它具有这种类型的类 请注意,如果您使用transformers
库而不是mtl
,则必须明确地lift
所有内容。我理解!,我没有读单子的例子。非常感谢。
lift $ tell $ {- code ... -}
...