MonadWriter 中的冗余 class

Redundancy in the MonadWriter class

我一直在阅读 MonadWriter class 的文档,我发现 writertell 可以相互书写。在我看来,如果 class 方法的行为与文档描述的一样,那么 pass 可以用 telllisten:

来编写
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]))