2016-10-30 4 views
13

निम्नलिखितक्या पैटर्न पैटर्न के भीतर मूल्यांकन ऑर्डर के बारे में कोई गारंटी है?

(&&) :: Bool -> Bool -> Bool 
False && _ = False 
True && False = False 
True && True = True 

वांछित शॉर्ट सर्किट संपत्ति False && undefined ≡ False है। पहला खंड, जो कि सही तर्क में गैर-सख्त है, किसी और चीज की कोशिश करने से पहले जांच की गारंटी है।

जाहिर है, यह अभी भी काम करता है अगर मैं आदेश को बदल और यहां तक ​​कि समारोह

both :: (Bool,Bool) -> Bool 
both (True,False) = False 
both (True, True) = True 
both (False, _) = False 

Prelude> both (False, undefined) 
False 

uncurry लेकिन यह वास्तव में मानक की गारंटी है? खंडों के आदेश के विपरीत, पैटर्न के मूल्यांकन का आदेश यहां इतना स्पष्ट नहीं है। क्या मैं वास्तव में यह सुनिश्चित कर सकता हूं कि (True,False) से मिलान (False,_) को समाप्त कर दिया जाएगा, एसएनडी तत्व का मूल्यांकन करने से पहले?

उत्तर

15

हां, यह गारंटी है कि both (False, undefined) अभिव्यक्ति का मूल्यांकन अलग नहीं होगा क्योंकि डेटा कन्स्ट्रक्टर पर मिलान करने से कन्स्ट्रक्टर के घटकों के खिलाफ बाएं से दाएं मिलान करने की गारंटी है और जैसे ही कुछ उप-पैटर्न विफल हो जाते हैं, पैटर्न विफल हो जाता है। चूंकि ट्यूपल का पहला तत्व False है, इसलिए पैटर्न पहले से ही मेल खाने में असफल होने पर (True, ...) शाखाओं के लिए विफल हो जाएगा।

प्रति Haskell 2010 Report, section 3.17.2

, जो पैटर्न मिलान की एक अनौपचारिक अर्थ विज्ञान देता है:

  1. पैटर्न चोर pat1 ... patn एक मूल्य है, जहां चोर है के खिलाफ मिलान एक निर्माता डेटा द्वारा परिभाषित किया गया, मूल्य पर निर्भर करता है:
    • मूल्य फार्म की है चोर v1 ... vn, उप पैटर्न मिलान किया जाता है बाएँ से सही componen के खिलाफ डेटा मूल्य के टीएस; यदि सभी मैच सफल होते हैं, तो समग्र मिलान सफल होता है; असफल होने या विचलित करने वाला पहला क्रमशः कुल मिलान विफल या अलग हो जाता है।
    • यदि मान con 'v1 ... vm है, जहां con con' पर एक अलग कन्स्ट्रक्टर है, तो मैच विफल हो जाता है।
    • यदि मान ⊥ है, तो मैच अलग हो जाता है।

के बाद से टपल वाक्य रचना सिर्फ एक डेटा निर्माता के लिए एक विशेष दर-मामला वाक्यात्मक चीनी है, ऊपर लागू होता है।

पैटर्न मिलान के पूर्ण उपचार के लिए, section 3.17.3 of the Haskell 2010 Report देखें, जो पैटर्न मिलान के औपचारिक अर्थशास्त्र प्रदान करता है (विशेष रूप से, आंकड़ा 3.2 इस प्रश्न से संबंधित है)।

ब्याज की एक और संसाधन कागज Pattern-driven Reduction in Haskell जो हास्केल के ठोस वाक्य रचना (आंकड़ा 3 में समारोह mP, पेज 7 प्रश्न के लिए प्रासंगिक है) का एक सार वाक्य रचना प्रतिनिधित्व की एक दुभाषिया (हास्केल में लिखित) के रूप में अर्थ विज्ञान निर्दिष्ट करता है।

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