2015-10-21 3 views
7

Effectの図は、pipesパッケージの公式チュートリアルで提供されています。 Effect以来どのように「効果」はすべてのフローではなく、2つのインフローのみをシールしますか?

type Effect = Proxy X()() X 

    Upstream | Downstream 
    +---------+ 
    |   | 
X <==  <==() 
    |   | 
() ==>  ==> X 
    | | | 
    +----|----+ 
      v 
      r 

は、私はすべてのフローを封止する、それだけでProxy X X X Xであることを期待していた、データの任意の流れを持っていません。しかし、代わりに、それは2つのインフローを可能にします。それには特別な理由はありますか?私はちょうどEffectが正常に署名Proxy X X X Xで、何を書けば、それは完全に罰金コンパイラに渡すことができます。

myMonad :: Proxy X X X X IO() 
myMonad = do 
    a <- lift $ getLine 
    lift $ print a 
    return() 

できないのはなぜこのような私たちrun何か?あなたの例から

答えて

1

あなたでき実行myMonad、ちょうどrunEffectの既存の定義を取り、多少その型を一般化:

import Pipes (lift) 
import Pipes.Core (closed) 
import Pipes.Internal 

type Effect' a b = Proxy X a b X 

-- Definition copied straight from Pipes.Core, type generalized to Effect' 
runEffect' :: Monad m => Effect' a b m r -> m r 
runEffect' = go 
    where 
    go p = case p of 
     Request v _ -> closed v 
     Respond v _ -> closed v 
     M  m -> m >>= go 
     Pure r -> return r 

eff :: Effect' X X IO() 
eff = do 
    a <- lift $ getLine 
    lift $ print a 
    return() 

main :: IO() 
main = runEffect' eff 
関連する問題