2012-05-17 37 views
6

Cho một hành động đơn lẻ Writer, tôi muốn sửa đổi nó bằng cách ánh xạ hàm trên dữ liệu viết bên trong hành động đơn lẻ.Thay đổi dữ liệu viết trong một đơn vị Writer

Cái gì như:

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

Có một chức năng như vậy đã tồn tại trong thư viện? Nếu không, làm thế nào có thể được xác định?

+0

Bạn có thể làm điều này bằng cách kết nối các 'pass' phương pháp trong lớp MonadWriter? Nếu tôi không làm cho lớp con của riêng tôi của Writer - 'Rewriter' cung cấp một hoạt động' retell'. –

+0

@stephentetley - sửa chữa bản thân mình, khi bạn muốn gõ thay đổi 'w' của trình đơn Writer bạn không thể làm điều này với' pass'. Tôi sẽ đi với một lớp con 'Rewriter' mở rộng' Writer' bằng 'retell'. –

Trả lời

11
retell f = Writer . second f $ runWriter 

Ngoài ra còn có chức năng mapWriter do thư viện cung cấp. Vì vậy, bạn có thể làm điều này:

retell = mapWriter . second 

Chức năng second là trong Control.Arrow, nhưng bạn có thể xác định một phiên bản ít chung của nó cho mình như thế này:

second f (a, b) = (a, f b) 
Các vấn đề liên quan