2010-12-14 3 views
7

이것은 StateWriter의 조합입니다. 나는 모나드 법칙을 점검했다.이 상태와 유사한 모나드의 이름은 무엇입니까

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이 다소 절름발이입니다.

+0

'conat'? 나는'return a = M을 기대했을 것이다. 플립 (,) a' 또는 그런 것. – ephemient

+0

Sry, typo,'const'. – luqui

+0

왜''= 'yield'('\ mappend \'s '\'mappend \'s' ', y)'입니까? 나는 반환 된 모노로이드에 대해 조금 혼란스러워합니다. – rampion

답변

0

어쩌면 SW (Statefull Writer)로 전화를 걸 수도 있습니다. 짧은 이름은 다소 직관적이어서 입력 내용을 저장한다고 생각합니다.

+2

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

+0

@rampion :'myFunctionWithVeryLongAndExtremelyDescriptiveName :: Integer -> SomeExtremelyComplicatedDatatypeWithThisIsLongestNameIcanThinkOf -> LongAndDescriptiveMonadT LongerAndMoreDescriptiveName a b 이것은 짧은 이름을 좋아하는 이유입니다. - 타이핑을 줄여줍니다. 그리고 이름을 이해하지 못하는 사람들을 위해 : RTMF :) – fuz

+4

하스켈 문화에서 RTFP. – luqui

3

"내각 작성자"?

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) 
+0

이 아닌가? censor :: MonadWriter wm => (w -> w) -> ma -> ma (Control.Monad.Writer.Class)는? –

+1

@ Ed'ka - 예 postW는 검열 자와 동일하지만 둘 다 "후 변압기"이며 "로그"(w -> w)는 하나의 작가 모나드 연산으로 쌍을 이루어야합니다. 인트로 스펙 션을 사용하면 복합 모나드 표현식에서 >> >>와 연결할 수 있습니다. –

2

Monoidal State합니다. MonoState. MState. AccumState.

+1

AccumState는 멋지 네요. 아마도 StateAccum입니다. 가장 작은. – luqui

관련 문제