2017-09-15 18 views
8

इस कोड OCaml के साथ ही एफ # में ठीक संकलित:यह एफ #/ओकैमल "मैच" अभिव्यक्ति संकलित क्यों करता है?

let testmatch k = 
    match k with 
    | jqk3jtl23jtlk123 -> true 

मैं दोनों FSI और utop में परीक्षण किया है। यह हमेशा true देता है।

jqk3jtl23jtlk123 पूरी तरह से यादृच्छिक है, और इसका प्रकार 'a के रूप में अनुमानित है। यहां तक ​​कि अगर मैं एक डेटाप्रकार साथ k विवश (जैसे let testmatch (k: int) =) यह संकलित (जाहिर है int -> bool बजाय 'a -> bool करने के लिए testmatch के प्रकार बाधित हालांकि

कोई समझा सकते हैं कृपया क्या हो रहा है विशेष रूप से:।?

  • क्यों करता है संकलक स्वीकार एक पूरी तरह से यादृच्छिक शाब्दिक jqk3jtl23jtlk123?
  • कारण है कि मैं नहीं एक inexhaustive मैच चेतावनी मिलता है?
  • मैच वास्तव में कर रही है?
  • क्या है
+7

आप मान 'jqk3jtl23jtlk123' के खिलाफ मिलान नहीं कर रहे हैं आपको लगता है कि जो कुछ भी मेल खाता है' k' है 'jqk3jtl23jtlk123' नाम के एक मूल्य बना रहे हैं के बराबर है। – Marth

+2

इन भाषाओं में आप आमतौर पर एक मूल्य अभिव्यक्ति या पैटर्न मिलान अभिव्यक्ति में होते हैं, और ये दोनों अलग-अलग व्यवहार करते हैं। पैटर्न मिलान 'मिलान' के बाद होता है, 'फ़ंक्शन' के बाद, और किसी भी फ़ंक्शन/विधि पैरामीटर में होता है। – TheQuickBrownFox

उत्तर

15

इस मामले में, "शाब्दिक" jqk3jtl23jtlk123 एक मान्य चर नाम है, और इसलिए -> वर्णों के बाईं ओर पैटर्न क्या है जैसा आपने लिखा है let jqk3jtl23jtlk123 = k। चूंकि यह k का कोई मान स्वीकार करता है, और इसके प्रकार को बाधित नहीं करता है क्योंकि सभी प्रकार के लिए बाध्यकारी काम करता है, अनुमानित प्रकार 'a है, जो कि सामान्य सिस्टम प्रकार का सामान्य मूल्य प्रदर्शित कर सकता है।

यदि आप शाब्दिक को किसी ऐसे पहचान में बदलते हैं जो मान्य पहचानकर्ता नहीं है, उदाहरण के लिए एक अंक से शुरू होता है, तो यह संकलित करने में विफल हो जाएगा।

आप उद्धरण में शाब्दिक लपेट हैं, तो यह शाब्दिक स्ट्रिंग मान के रूप में व्याख्या की जाएगी, आप inexhaustive मैच चेतावनी मिलती है चाहिए, और यह string करने के लिए k के प्रकार विवश होगा।

9

यह एक वाइल्डकार्ड पैटर्न है, जिसका नाम k बराबर है। यह

let testmatch k = 
    let jqk3jtl23jtlk123 = k in 
    true 
संबंधित मुद्दे