Какое хорошее название для этой государственной монады - PullRequest
7 голосов
/ 14 декабря 2010

Это что-то вроде комбинации State и Writer.Я проверил законы монады.

newtype M s a = M { runM :: s -> (s,a) }

instance (Monoid s) => Monad (M s) where
    return = M . const . (mempty,)
    m >>= f = M $ \s -> 
        let (s' ,x) = runM m s
            (s'',y) = runM (f x) (s `mappend` s')
        in (s' `mappend` s'', y)

StateWriter кажется отстойным.

Ответы [ 3 ]

3 голосов
/ 14 декабря 2010

«Интроспективный писатель»?Кажется, что интересным, что вы можете сделать с этим (что вы не можете сделать с Writer), является написание функции интроспекции, которая проверяет состояние / вывод и изменяет его:

introspect :: (s -> s) -> M s ()
introspect f = M $ \s -> (f s, ()) 

Я не вижучто вы можете сделать это для писателя, я думаю, что вы должны обойтись с посттрансформатором вместо:

postW :: Writer w a -> (w -> w) -> Writer w a
postW ma f = Writer $ let (w,a) = getWriter ma in (f w,a)
2 голосов
/ 14 декабря 2010

Monoidal State. MonoState. MState. AccumState.

0 голосов
/ 14 декабря 2010

Возможно, позвоните SW (Statefull Writer), я думаю, короткие имена довольно интуитивно понятны и сохраняют некоторую печать.

...