给定Writer
monad动作,我想通过将函数映射到monad动作中的书面数据来修改它。
类似的东西:
retell :: (w -> w') -> Writer w a -> Writer w' a
库中是否已存在此类功能?如果没有,怎么定义?
答案 0 :(得分:11)
retell f = Writer . second f $ runWriter
图书馆还提供mapWriter
功能。所以你可以这样做:
retell = mapWriter . second
second
函数位于Control.Arrow
,但你可以自己定义一个不那么通用的版本:
second f (a, b) = (a, f b)