जो आप करने की कोशिश कर रहे हैं उसे समानता पैटर्न कहा जाता है, और यह उद्देश्य कैमल द्वारा प्रदान नहीं किया जाता है। उद्देश्य कैमल के पैटर्न स्थिर और पूरी तरह से संरचनात्मक हैं। यही है, क्या पैटर्न से मेल खाता मूल्य पूरी तरह से मूल्य की संरचना पर निर्भर करता है, और इस तरह संकलित समय पर निर्धारित किया जाता है। उदाहरण के लिए, (_, _)::tail
एक ऐसा पैटर्न है जो किसी भी गैर-खाली सूची से मेल खाता है जिसका सिर एक जोड़ी है। (identifier, value)::tail
बिल्कुल वही मान मेल खाता है; केवल अंतर यह है कि उत्तरार्द्ध दो और नाम identifier
और value
बांधता है।
हालांकि कुछ भाषाओं में समानता पैटर्न हैं, फिर भी गैर-मामूली व्यावहारिक विचार हैं जो उन्हें परेशान करते हैं। कौन सा समानता? ओककल में शारीरिक समानता (==
), संरचनात्मक समानता (=
ओकैम में), या कुछ प्रकार-निर्भर कस्टम समानता? इसके अलावा, ओकैम में, एक स्पष्ट वाक्यविन्यास संकेत है जिसमें नाम बाइंडर्स हैं और कौन से नाम पहले बाध्य मानों के संदर्भ में हैं: पैटर्न में कोई लोअरकेस पहचानकर्ता एक बाइंडर है। इन दो कारणों से पता चलता है कि क्यों ओकैम में बराबर समानता पैटर्न नहीं हैं। ओकंपल में समानता पैटर्न व्यक्त करने का मूर्ख तरीका गार्ड में है। इस तरह, यह तुरंत स्पष्ट है कि मिलान संरचनात्मक नहीं है, identifier
इस पैटर्न मिलान से बंधे नहीं है, और कौन सा समानता उपयोग में है। बदसूरत के रूप में, यह दर्शक की नजर में है - एक आदत ओकंपल प्रोग्रामर के रूप में, मुझे समानता पैटर्न बदसूरत (उपरोक्त कारणों से) मिलते हैं। active patterns, जो आप गार्ड कि एक पैटर्न में एक ही साइट चिंता का विषय पूर्व परिभाषित करते हैं:
match bindings with
| (id, value)::tail when id = identifier -> value
| (_, _)::tail -> getValue identifier tail
| [] -> -1
एफ # में, आप एक और संभावना है।
आपका मूल दृष्टिकोण मुझे प्रोलॉग के एकीकरण की याद दिलाता है, यह कार्यात्मक से अपेक्षाकृत घोषणात्मक है। – ron