2010-08-28 21 views
8

Có một OCaml tương đương với mẫu của Haskell khớp với số lượng đối số tùy ý không? Ví dụ, tôi có thể có một cái gì đó giống như:làm thế nào để khớp mẫu trên một số đối số tùy ý?

merge [] lst = lst 
merge lst [] = lst 
merge l1 @ (n : ns) l2 @ (m : ms) = 
    if n < m then n : merge ns l2 else m : merge l1 ms 

(Ví dụ là sự ăn cắp từ phát triển ứng dụng với các Mục tiêu CAML :)

Cảm ơn.

+1

Tôi sẽ không nói rằng ví dụ của bạn có số lượng đối số tùy ý, hàm này lấy chính xác hai đối số. – adamse

+0

adamse: true, nhưng câu hỏi của tôi áp dụng cho bất kỳ chức năng nào tham gia nhiều hơn một đối số. –

Trả lời

14

Bạn không thể phù hợp với nhiều đối số như vậy, nhưng bạn có thể phù hợp với các bộ, vì vậy bạn có thể làm:

let rec merge l1 l2 = match l1, l2 with 
| [], lst 
| lst, [] -> lst 
| (n::ns), (m::ms) -> if n < m then n :: merge ns l2 else m :: merge l1 ms 

Nếu bạn ok với chức năng lấy đối số của nó như một tuple bạn cũng có thể sử dụng function như sau:

let rec merge = function 
| [], lst 
| lst, [] -> lst 
| (n::ns as l1), (m::ms as l2) -> if n < m then n :: merge (ns, l2) else m :: merge (l1, ms) 
Các vấn đề liên quan