2010-05-17 19 views
11

में "प्रोग्रामिंग एफ #" मैं इस तरह एक पैटर्न मिलान में आए (मैं थोड़ा सरलीकृत): मैं समझता हूँ कि आखिरी मैच सिर पहचानतासमझौता विपक्ष ऑपरेटर के साथ मिलान पैटर्न

let rec len list = 
    match list with 
    | [] -> 0 
    | [_] -> 1 
    | head :: tail -> 1 + len tail;; 

व्यावहारिक रूप से और सूची की पूंछ। संकल्पनात्मक रूप से, मुझे नहीं लगता कि यह क्यों काम करता है। जहां तक ​​मैं समझता हूं, :: कंस ऑपरेटर है, जो सूची की मुख्य स्थिति में एक मूल्य जोड़ता है, लेकिन यह मुझे नहीं देखता है कि इसे यहां ऑपरेटर के रूप में उपयोग किया जा रहा है। क्या मुझे इसे सूचियों के लिए "विशेष वाक्यविन्यास" के रूप में समझना चाहिए, जहां :: संदर्भ के आधार पर ऑपरेटर या "मिलान पैटर्न" के रूप में व्याख्या की जाती है? या अन्य ऑपरेटरों के साथ सूचियों के अलावा अन्य विचारों के लिए भी यही विचार बढ़ाया जा सकता है?

उत्तर

10

ब्रायन के उत्तर के अलावा, कुछ बिंदु हैं जो ध्यान देने योग्य हैं। ,

let l = 1::2::[]     // As an operator 
match l with x::xs -> 1 | [] -> 0 // As a pattern 

इसका मतलब है कि यह थोड़ा विशेष निर्माण है क्योंकि (उदाहरण के + के लिए) अन्य ऑपरेटरों (घटक के लिए पैटर्न के रूप में इस्तेमाल नहीं किया जा सकता: h::t वाक्य रचना एक ऑपरेटर और एक पैटर्न के रूप में के रूप में दोनों इस्तेमाल किया जा सकता नतीजे ऑपरेटर के तर्कों के परिणामस्वरूप) - जाहिर है, + के लिए, यह संदिग्ध होगा।

इसके अलावा, पैटर्न [_] दिलचस्प है, क्योंकि यह नेस्टेड पैटर्न का एक उदाहरण है। यह तैयार करता:

  • _ - एकल तत्व सूची पैटर्न है, जो एकल तत्वों के साथ एक सूचियों से मेल खाता है और सूची के तत्व से मेल खाता है - पैटर्न, जो किसी भी मान से मेल खाता है और किसी भी प्रतीकों
  • [ <pattern> ] बाध्य नहीं करता अंडरस्कोर नेस्टेड <pattern> के साथ।

आप match 1::[] with | [x] -> x भी लिख सकते हैं जो एकल तत्व (इस मामले में 1) के मान को वापस कर देगा।

+0

धन्यवाद, आपका बिंदु :: एक विशेष निर्माण होने के नाते मैं बिल्कुल अस्पष्ट था। मैंने अन्य ऑपरेटरों को "समान" तरीके से मिलान करने वाले पैटर्न में उपयोग करने का प्रयास किया, लेकिन इससे ज्यादा समझ नहीं आई और मुझे कहीं भी नहीं मिला, जो मुझे विपक्ष के बारे में सोच रहा था। – Mathias

+1

ध्यान दें कि यह टुपल्स के लिए भी सही है - आप (,) पैटर्न को बनाने और मिलान करने/अनपैक करने के लिए पैटर्न का उपयोग कर सकते हैं, और अन्य प्रकारों के लिए भी (कुछ()/कोई नहीं) आदि – Benjol

+0

यहां सभी की एक सूची है [सभी समर्थित पैटर्न प्रकार] (उदाहरण के साथ https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/pattern-matching)। – JanDotNet

13

यह सूचियों के लिए विशेष वाक्यविन्यास है। आप एक साथ भेदभाव संघ thusly के रूप में list प्रकार के बारे में सोच सकते हैं:

type list<'T> =   // ' 
    | Nil 
    | Cons of 'T * list<'T> 

सिवाय इसके कि वहाँ विशेष सिंटेक्स Nil हो [] और Cons(h,t)h::t हो बनाता है। फिर यह भेदभावपूर्ण संघ पर मेल खाने वाला सामान्य पैटर्न है। क्या उससे मदद हुई?

(संभवतः भी this blog entry देखें।)

+0

यह बहुत उपयोगी है, धन्यवाद! – Mathias

2

यह एक फ़ॉर्मेटर के रूप में प्रयोग किया जाता है या तीन पैटर्न को औपचारिक रूप से pattern, `सूची 'मिलान किया जाता है:

[] का मतलब सूची खाली है

[_] का अर्थ है कि सूची में एक तत्व है, क्योंकि आपको इस बात की परवाह नहीं है कि तत्व क्या है, इसलिए बस वहां रखें, आप [ए] का भी उपयोग कर सकते हैं।

सिर :: पूंछ का अर्थ है कि सूची में दो भाग हैं: एक सिर और पूंछ।

यदि आप संरचना के बाद एक शक्तिशाली के रूप में F # पैटर्न मिलान देख सकते हैं।

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