2010-11-15 5 views
12

मैं अक्सर वाक्यांश सुनता हूं, गार्ड केवल सिंटैक्टिक चीनी हैं, यदि अन्यथा (या केस स्टेटमेंट) के लिए।गार्ड desugaring

किसी निम्नलिखित उदाहरण desugar कृपया:

halfOf :: Int -> Int 
halfOf x | even x = div x 2 

(समारोह जानबूझकर आंशिक है)

धन्यवाद, एक बिना क्रिया मामले से शुरू हो रहा त्रुटि के

उत्तर

3

पैटर्न मिलान अर्थ विज्ञान मानक के अगले भाग में परिभाषित कर रहे हैं: Formal Semantics of Pattern Matching

आपके प्रश्न के लिए प्रासंगिक कदम सी है।

case e' of 
{y -> 
    case v of { 
     p -> let { decls } in 
      if g1 then e1 ... else if gn then en else y ; 
     _ -> y }} 

तो पैटर्न गार्ड if के मामले और "fallthrough" में परिभाषित कर रहे हैं कार्यान्वित किया जाता है: आप देख सकते हैं, पैटर्न प्रपत्र

case v of { p | g1 -> e1 ; ... 
       | gn -> en where { decls } 
      _  -> e' } 

पैटर्न में अनुवाद कर रहे हैं के गार्ड के साथ मेल खाता है के रूप में गार्ड के बिना मेल खाता है एक चर के लिए अभिव्यक्ति को बाध्य करके औरके else खंड में और फिर उस पैटर्न में जिसे आप गिरना चाहते हैं उसे दोहराएं।

अगर वहाँ चले जाते करने के लिए कोई मामला है (अपने उदाहरण के रूप में) एक कदम ख है, जो एक डिफ़ॉल्ट मामले _ -> error "No match"

+0

संदर्भ के लिए धन्यवाद। मुझे एक शाखा को पैटर्न मिलान त्रुटि के रूप में चिह्नित करने में सक्षम होना अच्छा लगेगा, लेकिन मैं देख सकता हूं कि भाषा द्वारा ऐसी कार्यक्षमता क्यों नहीं दी जाती है। धन्यवाद! – Ozgur

12
halfOf x = 
    if even x 
    then div x 2 
    else error "Incomplete pattern match" 

सटीक प्रकार है भाषा परिभाषा द्वारा निर्दिष्ट नहीं है, और संकलक से कंपाइलर में भिन्न होता है।

संपादित करें: यदि कई गार्ड और/या पैटर्न हैं, तो प्रत्येक गार्ड या पैटर्न मैच पिछले मामले के गैर-मिलान भाग में जाता है।

compare x y 
    | x == y = foo 
    | x /= y = bar 
compare _ _ = baz 

पैदा करता

compare x y = 
    if x == y 
    then foo 
    else if x /= y 
     then bar 
     else baz 
+0

yaha सम्मिलित करता है द्वारा डाला गया होगा! यहां एक समस्या है। यह एक पैटर्न मिलान त्रुटि नहीं है। अगर इस लाइन के बाद कोई और मामला है तो क्या होगा? – Ozgur

+2

@ ओजगुर: यदि आप एक पूर्ण उत्तर चाहते हैं तो जानबूझकर गलत शब्दों वाले प्रश्नों वाले लोगों को आज़माएं और चबाएं। – Akusete

+0

@ ओज़गुर: http://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html#Guards – Akusete