2012-01-15 10 views
10

मैंने arrow notation documentation page पढ़ा है, लेकिन यह मुझे पूरी तरह से स्पष्ट नहीं है कि "पाइप ब्रैकेट" "7.10.3" के तहत उपयोग किया जाता है। अपने स्वयं के नियंत्रण संरचनाओं को परिभाषित करना "desugar।विशेष ब्रैकेट (| ... |) desugar क्या करते हैं?

ऊपर दस्तावेज़

proc x -> do 
    y <- f -< x+1 
    (|untilA (increment -< x+y) (within 0.5 -< x)|) 

तीर संकेतन का उपयोग किए बिना बराबर कोड क्या है में उदाहरण को देखते हुए?

उत्तर

14

(| ... |) ब्रैकेट (आमतौर पर केला ब्रैकेट कहा जाता है) proc नोटेशन के अंदर आदेशों पर चलने वाले फ़ंक्शन को लागू करने के लिए हैं। वे एक सामान्य कमांड से कमांड (जिसे 'ऑपरेटर' कहा जाता है) पर चलने वाले फ़ंक्शन को असंबद्ध करने के लिए उपयोग किया जाता है। बाइनरी इंफिक्स ऑपरेटर विशेषीकृत हैं, इसलिए आपको (| (&&&) x y |) लिखने की आवश्यकता नहीं है।

desugaring के लिए, वे फॉर्मthe Arrows paper से जीएचसी का संस्करण हैं।

रूप इस प्रकार परिभाषित किया गया है:

proc पी ->रूप c1 c2 ... cn

=

(proc पी -> सी 1) (proc पी -> C2) ... (proc पी -> cn)

तो, proc x -> (|untilA (increment -< x+y) (within 0.5 -< x)|) बन जाएगा:

untilA (proc x -> increment -< x+y) (proc x -> within 0.5 -< x) 

आप इस desugar चाहते हैं पूरी तरह से तो कोई तीर वाक्य रचना बाईं, यह बन गयी:

untilA (arr (\x -> x+y) >>> increment) (arr (\x -> x) >>> within 0.5) 
0

यह एक बहुत ही किसी न किसी और सहज जवाब है और मैं यह सही है कुछ नहीं कर रहा हूँ, लेकिन यह लगता है यह है की तरह। आप

proc a -> do 
    a1 <- command1 <- ... 
    ... 
    an <- commandn <- ... 

    (| structure (block1 -< expression1[a, a1, ..., an]) 
       ... 
       (blockm -< expressionm[a, a1, ..., an]) 
    |) 

है तो (||)block रों में दायरे में स्थित सभी <- -bound चर में खिला का एक तरीका है, यानी यह हो जाता है (बराबर करने के लिए)

proc a -> do 
    a1 <- command1 <- ... 
    ... 
    an <- commandn <- ... 

    structure (proc (a, a1, ..., an) -> do 
        block1 -< expression1[a, a1, ..., an]) 
       ... 
       (proc (a, a1, ..., an) -> do 
        blockm -< expressionm[a, a1, ..., an]) 
         -< (a, a1, ..., an) 

मैं केवल यह समझा antijoins in Rel8 के लिए ओलिवर चार्ल्स के दस्तावेज़ पढ़ने पर। मुझे अभी भी यह दिमाग झुकने लगता है।

+0

और मुझे लगता है कि ऑपरेशन ('संरचना') के तर्कों में '- <' द्वारा कैप्चर किए गए चर को ऑपरेशन के बाहर बाध्य चर से संबंधित होना चाहिए, जिसके लिए तीर तर्कों की आवश्यकता है 'संरचना' उनके इनपुट प्रकार में polymorphic हैं। –

संबंधित मुद्दे