2013-07-07 2 views
2

파이프를 사용하여 ProxyFast 또는 ProxyCorrect 유형의 MonadTransControl 인스턴스를 작성하려고합니다. 이것이 내가 가진 것입니다 :ProxyFast/ProxyCorrect의 MonadTransControl 인스턴스

instance MonadTransControl (ProxyFast a' a b' b) where 
    data StT (ProxyFast a' a b' b) a = StProxy { unStProxy :: ProxyFast a' a b' b Identity a} 
    liftWith = undefined 
    restoreT = undefined 

liftWith 또는 restoreT를 작성하는 방법을 모르겠습니다. 다른 모나드 변환기의 인스턴스는 모나드를 "스왑"하는 함수를 사용합니다 (예 : EitherT e m a -> m (EitherT e Identity a)). 그러나 파이프에서 이러한 함수를 찾을 수 없습니다. ProxyCorrect/ProxyFast의 MonadTransControl 인스턴스는 어떻게 생겼습니까? 아니면 하나를 쓰는 것이 불가능합니까? (예인 경우 파이프 4.0에서 가능합니까?)

+2

나는 'MonadTransControl'을 결코 이해하지 못했습니다. 그것을 사용하는 방법을 설명하는 자습서 또는 블로그 게시물이 있습니까? –

+1

답변을 찾기 위해 http://www.yesodweb.com/blog/2011/08/monad-control – bennofs

답변

4

감사합니다. 이제 더 나은 답변을 드릴 수 있습니다.

아니요, pipes 버전을 사용하여 구현할 방법이 없습니다. 그 이유는 MonadTransControl은 모나드 변환기가 기본 모나드의 단일 레이어 위에 구축되기를 기대하기 때문입니다.

ErrorT ~ m (Either e r) 
StateT ~ s -> m (r, s) 
WriterT ~ m (r, w) 
ReaderT ~ i -> m r 
ListT ~ m [r] -- This version of ListT is wrong, and the true ListT 
       -- would not work for `MonadTransControl` 

그러나, Proxy은 기본 모나드의 단일 층을 포장하지 않습니다이 같은 MonadTransControl 현재 구현 모든 모나드 변압기, 마찬가지입니다. 이것은 pipes 버전 모두에 기본 모나드의 레이어를 원하는만큼 중첩시킬 수있는 버전에 해당합니다. pipes 모든 희망이 있음을 의미하지 않는다 MonadTransControl를 구현하지 않습니다해서, 그러나

FreeT  -- from the `free` package 
ListT  -- when done "right" 
ConduitM -- from the `conduit` package 

:

는 사실, 기본 모나드를 여러 번 둥지 어떤 모나드 변압기는 같은 MonadTransControl 인스턴스를 무시합니다 잃어버린. pipes-safe은 일반적으로 MonadTransControl에서 예상되는 많은 작업을 구현합니다 (예 : bracket 리소스 취득). 특정 유스 케이스에 대해 자세히 설명 할 수 있으면 문제에 맞는 pipes 기반 솔루션이 있는지 자세히 설명 할 수 있습니다.

+0

행크스 만 찾을 수있었습니다. 네 말이 맞아, 나는 파이프 안전을 찾고 있었다. – bennofs