2015-10-21 10 views
7

pipes पैकेज के आधिकारिक ट्यूटोरियल में प्रदान किए गए Effect का आरेख यहां दिया गया है।सभी प्रवाहों के बजाय 'प्रभाव' केवल दो प्रवाह में कैसे आते हैं?

type Effect = Proxy X()() X 

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

Effect जब से मैं यह सिर्फ Proxy X X X X होने की उम्मीद कर रहा था, सभी प्रवाह सील, डेटा के किसी भी प्रवाह नहीं है। लेकिन इसके बजाय, यह दो प्रवाह में अनुमति देता है। क्या इसके लिए कोई विशेष कारण है? अगर मैं सिर्फ लिखने क्या एक 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 
संबंधित मुद्दे