2012-06-28 13 views
17

मुझे प्राथमिकता मिली और सहयोगीता यह समझने के लिए एक बड़ी बाधा है कि व्याकरण पहले नज़र में हैकेल कोड को व्यक्त करने का प्रयास कर रहा है।हास्केल प्राथमिकता: लैम्ब्डा और ऑपरेटर

उदाहरण के लिए,

blockyPlain :: Monad m => m t -> m t1 -> m (t, t1) 
blockyPlain xs ys = xs >>= \x -> ys >>= \y -> return (x, y) 

प्रयोग करके, मैं अंत में, मिला कौन सा रूप में काम करता तो इसका मतलब है

blockyPlain xs ys = xs >>= (\x -> (ys >>= (\y -> return (x, y)))) 
बजाय

blockyPlain xs ys = xs >>= (\x -> ys) >>= (\y -> return (x, y)) 

:

*Main> blockyPlain [1,2,3] [4,5,6] 
[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)] 

मैं एक ऑपरेटर के रूप में ghci (>> =) के लिए जानकारी प्राप्त कर सकता हूं, (infixl 1 >> =)।

लेकिन इसके लिए कोई जानकारी नहीं है -> क्योंकि यह ऑपरेटर नहीं है।

क्या आप में से कोई भी इस व्याकरण की चीज़ को समझने के लिए कुछ संदर्भ दे सकता है?

+0

[हास्केल रिपोर्ट] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-220003) हास्केल सिंटैक्स के लिए एक निश्चित संदर्भ है, हालांकि शायद बीएनएफ व्याकरण आपके प्रश्न के लिए थोड़ा कम स्तर है पूछ ...? –

उत्तर

23

लैम्बडास का नियम बहुत आसान है: लैम्ब्डा का शरीर असंतुलित कोष्ठक को मारने के बिना जितना संभव हो सके दाएं तक फैला हुआ है।

f (\x -> foo (bar baz) *** quux >>= quuxbar) 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
         body 
+3

जिसका अर्थ है कि यह आखिरी बार लागू होता है। यही है, (->) किसी भी अन्य ऑपरेटर के बाद कम प्राथमिकता है। मेरा मानना ​​है कि वही 'डू' और (<-) के साथ भी सही है, साथ ही वे यथासंभव यथासंभव विस्तार करते हैं, अंतिम आवेदन करते हैं, और किसी भी ऑपरेटर के बाद कम प्राथमिकता रखते हैं। –

+4

मुझे वास्तव में सटीकता के लिए "पहले" और "आखिरी" शब्द पसंद नहीं हैं - मुझे लगता है कि यह मूल्यांकन आदेश के साथ समूहबद्ध करता है। गणित के शिक्षण में यह कुछ है जो मैं चलाता हूं। मुझे ऑपरेटरों के बारे में सोचने के रूप में "कसकर" और "ढीला" पसंद है। वैसे भी, '->' वास्तव में एक इंफिक्स ऑपरेटर नहीं है, क्योंकि यह दो शर्तों को जोड़ता नहीं है; बल्कि, लैम्ब्डा एक अभिव्यक्ति के लिए एक वाक्य रचनात्मक रूप है। यही कारण है कि मैंने ऑपरेटरों के मामले में जवाब नहीं दिया। – luqui

+1

दोनों अंक अच्छी तरह से लिया गया। संचालन के आदेश के बारे में बात करते समय "प्रथम" और "आखिरी" वाक्यांश अधिकांश के -12 (और कुछ अंडरग्रेड नहीं) गणित पाठ्यक्रम में उपयोग किए जाते हैं। मेरा प्रयास उन सामान्य रूप से उपयोग करना था (हालांकि कम सटीक) आपके बहुत अच्छे उत्तर के लिए शर्तें। –

7

अंगूठे का एक अच्छा नियम है कि आप वाक्यात्मक निर्माणों में बनाया पर पूर्वता है कि एक कस्टम ऑपरेटर कभी नहीं कर सकते हैं लगता है। मिसाल के तौर पर इस उदाहरण पर विचार करें:

(if b then f *** x else f) *** y 

हैं नहीं हास्केल में वाक्यात्मक निर्माणों का एक बहुत (do और: *** की संबद्धता की परवाह किए बिना

if b then f *** x else f *** y 

, कोई भी रूप में बांध को यह उम्मीद करेंगे case लेआउट वाक्य रचना की वजह से एक छोटे से विशेष कर रहे हैं), लेकिन let एक और उदाहरण के रूप में इस्तेमाल किया जा सकता:

(let x = y in y *** x) /= ((let x = y in y) *** x) 
+2

फ़ंक्शन एप्लिकेशन और रिकॉर्ड अपडेट को छोड़कर ... – luqui