जब आप एक पैटर्न मिलान अभिव्यक्ति लिखते हैं, तो आप अपने पैटर्न में मनमानी कार्यों का उपयोग नहीं कर सकते हैं। आप केवल कन्स्ट्रक्टर का उपयोग कर सकते हैं, जो अनचाहे फ़ंक्शंस जैसा दिखता है। उदाहरण के लिए, फ़ंक्शन "+" को पूर्णांक पर परिभाषित किया गया है। तो अभिव्यक्ति 1+2
का मूल्यांकन किया गया है और 3 देता है; फ़ंक्शन "+" का मूल्यांकन किया जाता है, इसलिए आप x+y
पर मेल नहीं खा सकते हैं। यहाँ प्राकृतिक संख्या पर एक समारोह परिभाषित करने की कोशिश की जाँच करता है कि संख्या शून्य है कि क्या है:
let f x = match x with
| 0 -> false
| a+1 -> true
;;
यह काम नहीं कर सकते हैं! इसी कारण से, तारों के साथ आपका उदाहरण काम नहीं कर सकता है। समारोह "^" का तार तारों पर मूल्यांकन किया जाता है, यह एक निर्माता नहीं है।
x+1
पर मिलान काम करेगा ही अगर संख्या unevaluated प्रतीकात्मक unevaluated ऑपरेटर +
और एक प्रतीकात्मक निरंतर 1
से बाहर कर दिया भाव थे। ओसीएएमएल में यह मामला नहीं है। इंटीजर सीधे मशीन नंबरों के माध्यम से लागू किए जाते हैं।
जब आप एक प्रकार के प्रकार से मेल खाते हैं, तो आप रचनाकारों से मेल खाते हैं, जो अनियमित अभिव्यक्तियां हैं। उदाहरण के लिए:
# let f x = match x with
| Some x -> x+1
| None -> 0
;;
val f : int option -> int = <fun>
यह काम करता है क्योंकि 'a option
प्रकार इस तरह के Some x
के रूप में, एक प्रतीकात्मक अभिव्यक्ति से बाहर कर दिया गया है। यहां, Some
एक ऐसा फ़ंक्शन नहीं है जिसका मूल्यांकन किया जाता है और कुछ अन्य मूल्य देता है, बल्कि एक "कन्स्ट्रक्टर" देता है, जिसे आप किसी फ़ंक्शन के रूप में सोच सकते हैं जिसका मूल्यांकन कभी नहीं किया जाता है। अभिव्यक्ति Some 3
का मूल्यांकन किसी भी आगे नहीं किया गया है; यह वैसे ही रहता है। यह केवल ऐसे कार्यों पर है कि आप पैटर्न-मिलान कर सकते हैं।
सूचियां रचनाकारों से निर्मित प्रतीकात्मक, अनियमित अभिव्यक्तियां भी हैं; निर्माता ::
है। x :: y :: []
का परिणाम एक अनौपचारिक अभिव्यक्ति है, जिसे कॉस्मेटिक सुविधा के लिए केवल [x;y]
सूची द्वारा दर्शाया गया है। इस कारण से, आप सूचियों पर पैटर्न-मिलान कर सकते हैं।
: जहां स्ट्रिंग में संकलक भी स्ट्रिंग विभाजित करना चाहिए? "एबीसी" से "ए" "बीसी" या "एबी" "सी" – 0x434D53