2010-12-14 16 views
7

Esto es una combinación de State y Writer. He revisado las leyes de la mónada.¿Cuál es un buen nombre para esta mónada tipo estado

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 seem kinda lame.

+0

'conat'? Hubiera esperado 'devolver a = M. flip (,) a' o algo así. – ephemient

+0

Sry, typo, 'const'. – luqui

+0

¿Por qué '>> =' no produce '(s \' mappend \ 's '\' mappend \ 's' ', y)'? Estoy un poco confundido sobre el monoide devuelto. – rampion

Respuesta

0

Tal vez llame al SW (Statefull Writer), creo que los nombres cortos son bastante intuitivos y guardan algo de tipeo.

+2

'tipo SW a b = Más largoY más descriptivoNombre a b'? – rampion

+0

@rampion: 'myFunctionWithVeryLongAndExtremelyDescriptiveName :: Integer -> SomeExtremelyComplicatedDatatypeWhereThisIsTheLongestNameIcanThinkOf -> LongAndDescriptiveMonadT LongerAndMoreDescriptiveName a b' Es por esto que me gustan los nombres cortos. - Ahorra algo de tipeo. Y para los que no entienden el nombre: RTMF :) – fuz

+4

En la cultura Haskell, RTFP. – luqui

3

"Introspective Writer"? Parece que el interesantes que se pueden hacer con él (que no se puede hacer con el escritor) es escribir una función de introspección que examina el estado/salida y lo cambia:

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

no puedo ver que usted puede hacer esto por el escritor, creo que tendría que conformarse con un post-transformador en su lugar:

postW :: Writer w a -> (w -> w) -> Writer w a 
postW ma f = Writer $ let (w,a) = getWriter ma in (f w,a) 
+0

¿No es qué censor :: MonadWriter wm => (w -> w) -> ma -> ma (de Control.Monad.Writer.Class) es para? –

+1

@ Ed'ka - sí postW es lo mismo que censor. Pero ambos son "post-transformadores", la operación en el "registro" (w -> w) tiene que estar hermanada con una sola operación de mónada de escritor. Con introspectivamente puede encadenarlo con (>>) en expresiones monádicas compuestas. –

2

Monoidal State. MonoState. MState. AccumState.

+1

'AccumState' es agradable, tal vez' StateAccum'. Eso coincide con lo que necesito para menos. – luqui

Cuestiones relacionadas