2012-05-17 7 views
6

Dada una acción Writer mónada, quiero modificarlo mediante la asignación de una función a través de los datos escritos en el interior de la acción mónada.Cambio de los datos escritos en una mónada escritor

Algo así como:

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

¿Tiene una función de este tipo ya existe en las bibliotecas? Si no, ¿cómo se puede definir uno?

+0

Se puede hacer esto por el encadenamiento de la 'pass' método en la clase MonadWriter? Si no, crearía mi propia subclase de Writer - 'Rewriter' que proporciona una operación' retell'. –

+0

@stephentetley - corrigiéndome a mí mismo, ya que quieres escribir cambiar la 'w' de la mónada del escritor, no puedes hacer esto con' pass'. Me gustaría ir con una subclase 'Rewriter' que amplía' Writer' con 'retell'. –

Respuesta

11
retell f = Writer . second f $ runWriter 

Existe también una función mapWriter proporcionada por las bibliotecas. Por lo que podría hacer esto:

retell = mapWriter . second 

La función second está en Control.Arrow, pero se puede definir una versión menos general de usted mismo de esta manera:

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