2010-12-14 8 views
7

Jest to coś z połączenia State i Writer. Sprawdziłem prawa Monady.Co to jest dobra nazwa dla tej monady podobnej do stanu?

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 wydaje się trochę ułagodzony.

+0

'conat'? Spodziewałbym się zwrotu "a = M". flip (,) a' lub coś podobnego. – ephemient

+0

Sry, literówka, "const". – luqui

+0

Dlaczego '> =' nie daje '' '' '' s ''' '' '' '' '' '' '' '' Jestem trochę zdezorientowany, gdy zwrócono mi monitory. – rampion

Odpowiedz

0

Być może zadzwonić pod numer SW (Statefull Writer), myślę, że krótkie nazwy są raczej intuicyjne i pozwalają na zapisywanie.

+2

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

+0

@rampion: 'myFunctionWithVeryLongAndExtremelyDescriptiveName :: Integer -> SomeExtremelyComplicatedDatatypeWhereThisIsLongestNameIcanThinkOf -> LongAndDescriptiveMonadT LongerAndMoreDescriptiveName a b' Dlatego lubię krótkie nazwy. - To oszczędza trochę pisania. A dla tych, którzy nie rozumieją nazwy: RTMF :) – fuz

+4

W kulturze Haskell, RTFP. – luqui

3

"Introspekcyjny pisarz"? Wydaje się, że interesujący można z nim zrobić (że nie można zrobić z Writer) jest napisać funkcję introspekcji, że sprawdza stan/wyjścia i zmienia go:

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

nie widzę to ty można to zrobić za pisarza, myślę, że trzeba by zrobić z post-transformator zamiast:

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

Czy to nie to, co cenzor :: MonadWriter wm => (w -> w) -> ma -> ma (z Control.Monad.Writer.Class) jest dla? –

+1

@ Ed'ka - tak postW jest taki sam jak cenzor, ale oba są "post-transformatory", operacja na "log" (w -> w) musi być bliźniaczą z pojedynczą operacją pisarz-monada.Z introspekcją można ją połączyć za pomocą (>>) w złożonych wyrażeniach monadycznych: –

2

Monoidal State. MonoState. MState. AccumState.

+1

"AccumState" jest ładne, może "StateAccum"., To pasuje do tego, czego potrzebuję w najmniej. – luqui

Powiązane problemy