2015-10-21 12 views
7

Questo è lo schema di Effect fornito nel tutorial ufficiale del pacchetto pipes.Come mai "Effect" sigilla solo due in-flussi, invece di tutti i flussi?

type Effect = Proxy X()() X 

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

Dal Effect non dispone di alcun flusso di dati, mi aspettavo che fosse solo Proxy X X X X, sigillando tutti i flussi. Ma invece, consente i due flussi in entrata. C'è una ragione particolare per quello? Se scrivo solo quello che un Effect normalmente fa, con la firma Proxy X X X X, può passare il compilatore perfettamente bene:

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

Perché non possiamo run qualcosa di simile?

risposta

1

È possibile corsa myMonad dal vostro esempio, da solo prendendo la definizione esistente di runEffect e generalizzando il suo tipo un po ':

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 
Problemi correlati