Haskell 更改Writer monad中的写入数据

Haskell 更改Writer monad中的写入数据,haskell,monads,Haskell,Monads,给定一个Writermonad操作,我想通过将函数映射到monad操作中的写入数据来修改它 比如: retell :: (w -> w') -> Writer w a -> Writer w' a 库中是否已经存在这样的函数?如果不是,如何定义 retell f = Writer . second f $ runWriter 库还提供了mapWriter功能。所以你可以这样做: retell = mapWriter . second 第二个函数位于控件中。箭头,但您可以

给定一个
Writer
monad操作,我想通过将函数映射到monad操作中的写入数据来修改它

比如:

retell :: (w -> w') -> Writer w a -> Writer w' a
库中是否已经存在这样的函数?如果不是,如何定义

retell f = Writer . second f $ runWriter 
库还提供了
mapWriter
功能。所以你可以这样做:

retell = mapWriter . second
第二个
函数位于
控件中。箭头
,但您可以自己定义一个不太通用的版本,如下所示:

second f (a, b) = (a, f b)

可以通过链接MonadWriter类中的
pass
方法来实现这一点吗?如果没有,我会创建自己的Writer子类-
Rewriter
,它提供了一个
复述
操作。@stephentelley-自己更正,因为你想更改Writer monad的
w
,而你不能用
pass
来完成这个操作。我将使用
重写器
子类,它通过
复述
扩展
编写器