2015-01-09 6 views
6

मैं जिसमें वह निम्नलिखित समारोह को परिभाषित करता है बार्तोज़ Milewski द्वारा एक टुकड़ा पढ़ रहा हूँ:

instance Applicative Chan where 
    pure x = Chan (repeat x) 
    (Chan fs) <*> (Chan xs) = Chan (zipWith ($) fs xs) 

कोष्टक में समारोह आवेदन ऑपरेटर क्यों है? मैं समझता हूं कि यह आमतौर पर उपसर्ग नोटेशन फॉर्म में इंफिक्स फ़ंक्शन का उपयोग करने के लिए किया जाता है, लेकिन मुझे समझ में नहीं आता कि, इस मामले में, फ़ंक्शन को Chan (zipWith $ fs xs) के रूप में व्यक्त नहीं किया जा सका, और आश्चर्य कीजिए कि बीच क्या अंतर है दो है।

(अगर आप अभी भी संदर्भ की जरूरत है, article को देखें)

+1

की तरह देखा जा सकता था यह किसी भी आसान नहीं होगा अगर यह के रूप में 'चान (zipWith आईडी FS XS)' लिखा गया था: निम्नलिखित परिभाषा के साथ? यह वर्तमान कार्यान्वयन के समान ही है। – Carl

+0

याद रखें कि '($)' कुछ जादुई आदिम ऑपरेटर नहीं है: यह एक फ़ंक्शन है जैसे '(+) 'और' या'। – AJFarmar

उत्तर

13

इस मामले में, $ किया जा रहा zipWith को में पारित हो जाता है। यह

zipWith (\ f x -> f x) fs xs 

लेखन कोष्ठकों के बिना के रूप में ही है, यह

zipWith (fs xs) 

जो typecheck के लिए नहीं जा रहा है के बराबर हो गया होता।

ब्रांड्स में एक ऑपरेटर सामान्य पहचानकर्ता की तरह व्यवहार करता है।

apply = ($) 

कोड

zipWith apply fs xs 
+2

विशेष रूप से, हैकेल के व्याकरण के लिए आपको 'zipWith ' कहने की आवश्यकता है, जहां '' एक अभिव्यक्ति है। '($)' इन्फिक्स ऑपरेटर '$' एक * अभिव्यक्ति * में परिवर्तित किया गया है, जो कि "उपसर्ग में परिवर्तित" से थोड़ा अलग है, और दोनों कार्यों को उपसर्ग फ़ंक्शन और उपयोग के रूप में अन्य कार्यों के तर्क के रूप में अनुमति देता है। –

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