2011-01-23 6 views
8

आइए कहें कि मेरे पास प्रकार पूर्णांक की एक सूची है [1; 2; 3; 4; 5; 6; 7; 8] और मैं पैटर्न को पहले तीन तत्वों को एक बार में मिलान करना चाहता हूं। क्या नेस्टेड मैच स्टेटमेंट के बिना ऐसा करने का कोई तरीका है?Ocaml पैटर्न एक सूची में कई तत्वों से मेल खाता है

उदाहरण के लिए, क्या ऐसा किया जा सकता है?

let rec f (x: int list) : (int list) = 
begin match x with 
| [] -> [] 
| [a; b; c]::rest -> (blah blah blah rest of the code here) 
end 

मैं लंबे समय से नेस्टेड विधि है, जो होगा इस्तेमाल कर सकते हैं:

let rec f (x: int list) : (int list) = 
begin match x with 
| [] -> [] 
| h1::t1 -> 
    begin match t1 with 
    | [] -> [] 
    | h2::t2 -> 
    begin match t2 with 
    | [] -> [] 
    | t3:: h3 -> 
     (rest of the code here) 
    end 
    end 
end 

धन्यवाद!

उत्तर

11

हाँ, आप यह कर सकते हैं। वाक्यविन्यास इस प्रकार है:

let rec f (x: int list) : (int list) = 
begin match x with 
| [] -> [] 
| a::b::c::rest -> (blah blah blah rest of the code here) 
end 

लेकिन आप देखेंगे कि सूची में विफल होने पर यह विफल हो जाएगा यदि सूची में कम से कम तीन तत्व हैं। आप या तो एकल और दो तत्व सूचियों के लिए केस जोड़ सकते हैं, या बस कुछ भी मिलान करने वाले मामले को जोड़ सकते हैं:

let rec f (x: int list) : (int list) = 
    match x with 
    | a::b::c::rest -> (blah blah blah rest of the code here) 
    | _ -> [] 
+0

शांत, धन्यवाद! और कहें (ब्ला ब्ला ब्लाह यहां कोड के बाकी हिस्सों के लिए) मैं तत्व "ए" को छोड़कर सब कुछ वापस करना चाहता था। क्या मैं बस बी @ सी @ आराम करूँगा? – chesspro

+2

आप 'a :: ((b :: c :: rest) tl के रूप में मिलान कर सकते हैं) और फिर आप सूची के मुख्य तत्वों को पुनर्निर्मित किए बिना 'tl' का उपयोग कर सकते हैं। – nlucaroni

+0

उसे नहीं पता था, धन्यवाद! – chesspro

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