2014-07-14 5 views

답변

5

execStateT이어야합니까? runStatePPipes.Lift에서 더 쉽게 할 수 있습니다. 당신이 다른 단계가 다른 효과를 가지고있는 파이프 라인이있을 때 Pipes.Lift에서

import Pipes 
import Pipes.Lift 
import Control.Monad.State.Strict 

-- unnecessarily specific signature, function work with any Proxy 
foo :: Monad m => b -> Consumer a (StateT b m)() -> Consumer a m b 
foo b p = liftM snd $ runStateP b p 

기능은 중대하다. 파이프 라인의 특정 단계로 효과를 제한하는 것이 좋습니다.

+2

좋아요! 실제로는 [execStateP' 기능] (http://hackage.haskell.org/package/pipes-4.1.2/docs/Pipes-Lift.html#v:execStateP)이 있습니다. 감사! –

+0

아,'execStateP'에 대해 깜빡했습니다. 그렇다면 더 간단합니다. – danidiaz

4

danidiaz에서 언급 한 Pipes.Lift에서 execStateP을 사용할 수 있습니다.

execStateP :: Monad m => s -> Proxy a' a b' b (StateT s m) r -> Proxy a' a b' b m s 

편집 : 기본 모나드는 다음 "실행"모나드는 제거 할 수 MFunctor 당신이 스택의 상단에 기본 모나드를 가져 오기 위하여 distribute 기능을 사용할 수있는 경우 일반적으로

그 모나드 레이어. 예를 들어 execStateT를 사용

distribute 
    :: (Monad m, Monad (t m), Monad (t (Proxy a' a b' b m)), 
     MonadTrans t, MFunctor t) => 
    Proxy a' a b' b (t m) r -> t (Proxy a' a b' b m) r 

: 신중 모나드 스택을 정의하면 MFunctor 제한이 해제 될 수

> :t S.execStateT . distribute 
S.execStateT . distribute 
    :: Monad m => 
    Proxy a' a1 b' b (S.StateT s m) a -> s -> Proxy a' a1 b' b m s 

. 예를 들어 연속 레이어의 각면에 파이프 레이어가있는 신중하게 정의 된 모나드 스택을 사용하면 을 정의 할 수 있습니다. 이는 연속 변압기에서 작동하며 MFunctor이 아닙니다.

관련 문제