2012-05-17 63 views
6

給定Writer monad操作,我想通過在monad操作內寫入數據上映射函數來修改它。在Writer monad中更改寫入數據

喜歡的東西:

retell :: (w -> w') -> Writer w a -> Writer w' a 

請問這樣的功能已經在圖書館存在?如果不是,如何定義?

+0

你能做到這一點通過級聯'pass' MonadWriter類中的方法?如果沒有,我會做我自己的Writer的子類 - 'Rewriter',它提供了'retell'操作。 –

+0

@stephentetley - 糾正自己,因爲你想打字改變作家monad的'w',你不能用'pass'來做這個。我會用'Rewriter'子類去擴展'Writer'和'retell'。 –

回答

11
retell f = Writer . second f $ runWriter 

還有一個由庫提供的mapWriter函數。所以,你可以這樣做:

retell = mapWriter . second 

second功能是Control.Arrow,但你可以定義它自己這樣一個不太普通版本:

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