2015-10-21 15 views
7

Burada, pipes paketinin resmi dersinde verilen Effect diyagramı verilmiştir. Effect yanaNasıl olur? Efekt, tüm akışlar yerine sadece iki akışta sızdırmaz?

type Effect = Proxy X()() X 

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

Bütün akışlarını mühürleme, sadece Proxy X X X X olmasını bekliyordum, herhangi bir veri akışını yoktur. Fakat bunun yerine, iki akışa izin verir. Bunun için özel bir neden var mı? Sadece Effect normalde imza Proxy X X X X ile, ne yazarsanız, o mükemmel iyi derleyici geçirebilirsiniz:

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

Neden olamaz böyle biz run şey? örnekten

cevap

1

Sen can koşmak myMonad, sadece runEffect mevcut tanımını alarak ve biraz türünü genelleştirerek:

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 
İlgili konular