2012-05-17 2 views
6

Gegeben eine Writer Monad-Aktion, ich möchte sie ändern, indem ich eine Funktion über die geschriebenen Daten innerhalb der Monad-Aktion abbilde.Ändern der geschriebenen Daten in einer Writer-Monade

Etwas wie:

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

Gibt es eine solche Funktion existiert bereits in den Bibliotheken? Wenn nicht, wie kann man definiert werden?

+0

Können Sie dies tun, indem Sie die 'pass' Verkettungs Methode in der MonadWriter-Klasse? Wenn nicht, würde ich meine eigene Unterklasse von Writer machen - "Rewriter", die eine 'retell'-Operation bereitstellt. –

+0

@stephentlety - Ich korrigiere mich, wie Sie schreiben möchten, ändern Sie das 'w 'der Writer Monade können Sie dies nicht mit' pass' tun. Ich würde mit einer 'Rewriter'-Unterklasse gehen, die' Writer' mit 'retell' erweitert. –

Antwort

11
retell f = Writer . second f $ runWriter 

Es gibt auch eine mapWriter Funktion von den Bibliotheken zur Verfügung gestellt. So könnten Sie dies tun:

retell = mapWriter . second 

Die second Funktion in Control.Arrow ist, aber Sie können eine weniger allgemeine Version davon, sich wie folgt definieren:

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