2010-12-14 9 views
7

Questo è qualcosa di una combinazione di State e Writer. Ho controllato le leggi della monade.Qual è un buon nome per questa monade simile allo stato

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 sembra un po 'zoppo.

+0

'conat'? Mi sarei aspettato 'return a = M. flip (,) a' o qualcosa di simile. – ephemient

+0

Sry, typo, 'const'. – luqui

+0

Perché non '>> =' yield '(s \' mappend \ 's '\' mappend \ 's' ', y)'? Sono solo un po 'confuso riguardo al ritorno dei monoidi. – rampion

risposta

0

Forse chiamare SW (Statefull Writer), penso che i nomi brevi siano piuttosto intuitivi e salvino un po 'di digitazione.

+2

'type SW a b = LongerAndMoreDescriptiveName a b'? – rampion

+0

@rampion: 'myFunctionWithVeryLongAndExtremelyDescriptiveName :: Integer -> SomeExtremelyComplicatedDatatypeWhereThisIsTheLongestNameIcanThinkOf -> LongAndDescriptiveMonadT LongerAndMoreDescriptiveName a b' Ecco perché mi piacciono i nomi brevi. - Salva un po 'di battitura. E per quelli che non capiscono il nome: RTMF :) – fuz

+4

In cultura Haskell, RTFP. – luqui

3

"Scrittore introspettivo"? Sembra che il interessanti che si possono fare con esso (che non si può fare con Writer) è di scrivere una funzione introspect che esamina lo stato/uscita e la cambia:

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

non riesco a vedere che si può fare questo per chi scrive, penso che avrei dovuto accontentarsi di un post-trasformatore invece:

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

Non è quello che censura :: MonadWriter wm => (w -> w) -> ma -> ma (da Control.Monad.Writer.Class) è per? –

+1

@ Ed'ka - sì, il postW è lo stesso del censore, ma entrambi sono "post-trasformatori", l'operazione sul "registro" (w -> w) deve essere gemellato con una singola operazione writer-monad.Introspect è possibile concatenarlo con (>>) nelle espressioni monadiche composte: –

2

Monoidal State. MonoState. MState. AccumState.

+1

'AccumState' è bello, forse' StateAccum'. Ciò corrisponde a ciò di cui ho bisogno per meno. – luqui

Problemi correlati