Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Monad变压器和提升功能_Haskell_Monad Transformers - Fatal编程技术网

Haskell Monad变压器和提升功能

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

为什么除了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 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 ... -}
...