2011-01-23 34 views
8

Cho phép nói rằng tôi có danh sách loại số nguyên [1; 2; 3; 4; 5; 6; 7; 8] và tôi muốn mẫu khớp với ba phần tử đầu tiên cùng một lúc. Có cách nào để làm điều này mà không có câu lệnh kết hợp lồng nhau không? Ví dụ:Mẫu hình Ocaml khớp với nhiều phần tử trong một danh sách cùng một lúc

, có thể làm như thế này không?

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 

tôi có thể sử dụng phương pháp lồng nhau lâu, đó sẽ là:

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 

Cảm ơn!

Trả lời

11

Có, bạn có thể làm điều đó. Cú pháp giống như sau:

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 

nhưng bạn sẽ nhận thấy điều này sẽ thất bại nếu danh sách có ít hơn ba phần tử. Bạn có thể thêm trường hợp cho danh sách phần tử đơn và hai hoặc chỉ thêm trường hợp khớp với bất kỳ thứ gì:

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

cool, thanks! Và cho phép nói cho (blah blah blah phần còn lại của mã ở đây) Tôi muốn trả lại tất cả mọi thứ ngoại trừ yếu tố "a." tôi sẽ chỉ làm b @ c @ nghỉ ngơi? – chesspro

+2

bạn có thể khớp với 'a :: ((b :: c :: phần còn lại) dưới dạng tl)' và sau đó bạn có thể sử dụng 'tl' mà không cần tạo lại các phần tử đầu của danh sách. – nlucaroni

+0

không biết điều đó, cảm ơn! – chesspro

Các vấn đề liên quan