2012-05-17 10 views
6

Mając akcję monada Writer, chcę ją zmodyfikować poprzez odwzorowanie funkcji na dane zapisane w akcji monad.Zmienianie zapisanych danych w monitorze Writer

Coś jak:

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

Czy taka funkcja już istnieje w bibliotekach? Jeśli nie, jak można to zdefiniować?

+0

Można to zrobić przez łańcuchowym 'pass' metoda w klasie MonadWriter? Gdyby nie to, zrobiłbym własną podklasę Writer - 'Rewriter' która zapewnia operację' retell'. –

+0

@stephentetley - poprawiam się, gdy chcesz wpisać zmienić 'w' monitu Writer, którego nie możesz zrobić za pomocą' pass'. Poszedłbym z podklasą 'Redaktora', która rozszerza' Writer' o 'retell'. –

Odpowiedz

11
retell f = Writer . second f $ runWriter 

Istnieje również funkcja mapWriter dostarczona przez biblioteki. Więc można to zrobić:

retell = mapWriter . second 

Funkcja second w Control.Arrow, ale można określić mniej ogólną wersję samemu takiego:

second f (a, b) = (a, f b) 
Powiązane problemy