MonadWriter 中的冗余 class
Redundancy in the MonadWriter class
我一直在阅读 MonadWriter class 的文档,我发现 writer
和 tell
可以相互书写。在我看来,如果 class 方法的行为与文档描述的一样,那么 pass
可以用 tell
和 listen
:
来编写
pass :: m (a, w -> w) -> m a
pass m = do
((a, f), w) <- listen m
tell $ f w
return a
我的理解正确吗?
这最终写成w <> f w
,但它应该写成f w
。
ghci
> import Control.Monad.Writer as W
> :{
pass m = do
((a, f), w) <- listen m
tell (f w)
return a
:}
> pass (writer ((0, map (+ 10)), [1])) :: Writer [Integer] Int
WriterT (Identity (0,[1,11]))
> W.pass (writer ((0, map (+ 10)), [1])) :: Writer [Integer] Int
WriterT (Identity (0,[11]))
我一直在阅读 MonadWriter class 的文档,我发现 writer
和 tell
可以相互书写。在我看来,如果 class 方法的行为与文档描述的一样,那么 pass
可以用 tell
和 listen
:
pass :: m (a, w -> w) -> m a
pass m = do
((a, f), w) <- listen m
tell $ f w
return a
我的理解正确吗?
这最终写成w <> f w
,但它应该写成f w
。
ghci
> import Control.Monad.Writer as W
> :{
pass m = do
((a, f), w) <- listen m
tell (f w)
return a
:}
> pass (writer ((0, map (+ 10)), [1])) :: Writer [Integer] Int
WriterT (Identity (0,[1,11]))
> W.pass (writer ((0, map (+ 10)), [1])) :: Writer [Integer] Int
WriterT (Identity (0,[11]))