haskell - Order of evaluation for multiple operators in infix form -


यह देखते हुए:

  डेटा बेस = बेस {key1 :: text, key2 :: पाठ, key3 :: text} उदाहरण से दिखाना (उदाहरण के लिए) जेसन बेस से जहां parseJSON (ऑब्जेक्ट v) = बेस & lt; $ & gt; ((V।: "बेस 123") & gt; & gt; = (।: "Key1")) & lt; * & gt; - 1 ((v।: "बेस 123") & gt; & gt; = (।: "Key2")) & lt; * & gt; - 2 ((v।: "बेस 123") & gt; & gt; = (।: "Key3")) - 3 parseJSON_ = mzero  

यह किस क्रम का है इन्फिक्स ऑपरेटरों & lt; $ & gt; , & lt; * & gt; और & lt; * & gt; लागू होते हैं? दूसरे शब्दों में, अगर मैं इसे उपसर्ग फार्म में फिर से लिखता हूं:

  उदाहरण FromJSON बेस जहां parseJSON (ऑब्जेक्ट v) = बेस & lt; $ & gt; ((V।: "Base123") & gt; & gt; = (।: "Key1")) $ (& lt; * & gt;) ((v।: "Base123") & gt; & gt ; = (।: "Key2")) ((v।: "Base123") & gt; & gt; = (।: "Key3"))) parseJSON _ = mzero  

(नोटिस $ ऑपरेटर), दूसरा & lt; * & gt; का सही हिस्सा पहले मूल्यांकन किया जाएगा क्योंकि केवल इस मामले में यह समझ में आता है क्योंकि पहले & lt; * & Gt; 2 तर्कों की आवश्यकता है? और जब से इसे 2 तर्कों की आवश्यकता होती है, हमें $ का भी उपयोग करना पड़ता है।

मैंने शायद मेरा प्रश्न पूछा हो, यह समझना मुश्किल था कि मेरा क्या मतलब था, लेकिन मुझे आशा है कि आपने किया समझना।

असल में आपका उपसर्ग फ़ॉर्म बिल्कुल सही नहीं है, ऐसा होना चाहिए:

  पार्सजेसन (ऑब्जेक्ट v) = ((& lt; * & gt;) ((& lt; * & gt;) ((& lt; $ & gt;) बेस ((v।: "Base123") & gt; & gt; = ( ।: "Key1"))) ((v।: "Base123")> gt2; = (।: "Key2")))) ((v।: "Base123") & gt; & gt; = (। : "कुंजी 3"))))  

उपरोक्त परिभाषा अभी भी पूर्ण उपसर्ग फ़ॉर्म में नहीं है आपको & gt; & gt; = और ।: ले जाने के लिए उन्हें पूरी तरह से उपसर्ग बनाने के लिए लेना होगा कहा जा रहा है कि, infix रूप में कई ऑपरेटरों के मूल्यांकन के सटीक आदेश को खोजने के लिए मैं आपको गकी में खेलने के लिए प्रकारों में अधिक अंतर्दृष्टि प्राप्त करने का सुझाव देगा। प्रारंभिक चरण के रूप में, सभी ऑपरेटरों के लिए सहयोगीयता और पूर्ववर्ती आदेश देखें:

  λ & gt; : I (& lt; $ & gt;) (& lt; $ & gt;) :: फंकचर एफ = & gt; (ए - & gt; बी) - & gt; एफ ए - & gt; एफ बी इन्फोिक्स 4 & lt; $ & gt; λ & gt; : I (& lt; * & gt;) (& lt; * & gt;) :: एफ (ए - & gt; बी) - & gt; एफ ए - & gt; एफ बी इन्फिक्सेल 4 & lt; * & gt;  

इसलिए, वे दोनों सहकारी छोड़ दिए गए हैं और समान प्राथमिकता हैं। परिभाषा का इन्फ़िक्स फॉर्म काफी स्पष्ट है कि कैसे मूल्यांकन किया जाएगा: वे बायीं ओर से शुरू करते हैं और शुरू में & lt; $ & gt; को बेस पर लागू किया जाता है और इसके बाद दो & lt; * & gt; फ़ंक्शन के आवेदन प्रकार बेस को प्रारंभ में & lt; $ & gt; :

  λ> के लिए लागू किया गया है : बेस बेस :: पाठ - & gt; टेक्स्ट - & gt; टेक्स्ट - & gt; बेस λ & gt; : टी (बेस & lt; $ & gt;) (बेस & lt; $ & gt;) :: फंकचर एफ = & gt; च टेक्स्ट - & gt; F (टेक्स्ट - & gt; टेक्स्ट - & gt; बेस)  

अब, ((v।: "Base123") & gt; & gt; = (।: "Key1")) उपरोक्त प्रकार के परिणामस्वरूप लागू होता है:

  λ> चलो (ऑब्जेक्ट v) = अपरिभाषित :: वैल्यू λ & gt; : टी (आधार: & lt; $ & gt; (v।: "Base123") & gt; & gt; = (।: "Key1"))) (बेस & lt; $ & gt; ((v।: "Base123") & gt; & Gt; = (।: "Key1"))) :: पार्सर (टेक्स्ट - & gt; टेक्स्ट - & gt; बेस)  

आप देख सकते हैं कि यह पार्सर टाइप करें और पार्सर प्रकार से अंतर्निहित कार्य को निकालने के लिए, आपको & lt; * & gt; :

  λ> का उपयोग करना होगा : टी (& lt; * & gt;) (& lt; * & gt;) :: लागू एफ = & gt; एफ (ए - & gt; बी) - & gt; एफ ए - & gt; एफ बी λ & gt; (आधार: "बेस 123") & gt; & gt; = (।: "Key1")) & lt; * & gt; (बेस & lt; $ & gt; ((v।: " Base123 ") & gt; & gt; = (।:" Key1 ")) & lt; * & gt;) :: पार्सर टेक्स्ट - & gt; पार्सर (टेक्स्ट -> बेस)  

आप फ़ंक्शन परिभाषा के अन्य भागों पर यह कैसे लागू किया जाता है, यह देखने के लिए आप समान चरणों का अनुसरण कर सकते हैं। अंत में, आपको एक प्रकार का पार्सर बेस मिलेगा।


Comments

Popular posts from this blog

java - org.apache.http.ProtocolException: Target host is not specified -

java - Gradle dependencies: compile project by relative path -

ruby on rails - Object doesn't support #inspect when used with .include -