2012-05-17 4 views
6

Data un'azione di monad Writer, voglio modificarlo mappando una funzione sui dati scritti all'interno dell'azione monad.Modifica dei dati scritti in un writer monad

Qualcosa di simile:

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

Ha una tale funzione esiste già nelle librerie? Se no, come si può essere definiti?

+0

Si può fare questo concatenamento 'pass' metodo nella classe MonadWriter? Altrimenti, farei la mia sottoclasse di Writer - 'Rewriter' che fornisce un'operazione' retell'. –

+0

@stephentetley - correggendo me stesso, dato che si desidera modificare il parametro 'w' della monade Writer non è possibile farlo con' pass'. Vorrei andare con una sottoclasse di 'Rewriter' che estende' Writer' con 'retell'. –

risposta

11
retell f = Writer . second f $ runWriter 

C'è anche una funzione di mapWriter fornito dalle librerie. Così si potrebbe fare questo:

retell = mapWriter . second 

La funzione second è in Control.Arrow, ma è possibile definire una versione meno generale di voi stessi in questo modo:

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