2010-08-28 6 views
8

Esiste un OCaml equivalente al pattern di Haskell che corrisponde a un numero arbitrario di argomenti? Ad esempio, posso avere qualcosa di simile:come modellare la corrispondenza su un numero arbitrario di argomenti?

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 

(L'esempio sta sollevato da sviluppo di applicazioni con Objective Caml :)

Grazie.

+1

Non direi che il tuo esempio prende un numero arbitrario di argomenti, la funzione accetta esattamente due argomenti. – adamse

+0

adamse: true, ma la mia domanda si applica a qualsiasi funzione che richiede più di un argomento. –

risposta

14

Non è possibile abbinare più argomenti come tale, ma è possibile abbinare tuple, in modo da poter fare:

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 

Se sei ok con la funzione di prendere i suoi argomenti come una tupla è anche possibile utilizzare function come questo:

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)