我一直在阅读 MonadWriter 的文档类,并且我发现 writer
和 tell
可以相互编写。在我看来,如果类方法的行为如文档所描述的那样,那么 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]))
关于haskell - MonadWriter 类中的冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51202214/