首页 > 解决方案 > MonadWriter 类中的冗余

问题描述

我一直在阅读MonadWriter类的文档,我看到了这一点,writer并且tell可以根据彼此来编写。在我看来,如果类方法的行为与文档描述的一样,那么pass可以用telland来编写listen

pass :: m (a, w -> w) -> m a
pass m = do
    ((a, f), w) <- listen m
    tell $ f w
    return a

我的理解正确吗?

标签: haskellmonadsmonad-transformers

解决方案


这结束了写作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]))

推荐阅读