2010-08-28 6 views
8

Existe-t-il un OCaml équivalent au modèle de Haskell correspondant à un nombre arbitraire d'arguments? Par exemple, je peux avoir quelque chose qui ressemble:comment modéliser correspond à un nombre arbitraire d'arguments?

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'exemple de développement ya soulevé des applications avec Objective Caml :)

Merci.

+1

Je ne dirais pas que votre exemple prend un nombre arbitraire d'arguments, la fonction prend exactement deux arguments. – adamse

+0

adamse: true, mais ma question s'applique à toute fonction prenant plus d'un argument. –

Répondre

14

Vous ne pouvez pas correspondre à plusieurs arguments en tant que tels, mais vous pouvez faire correspondre tuples, de sorte que vous pouvez faire:

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 

Si vous êtes ok avec la fonction de prendre ses arguments en tant que tuple vous pouvez également utiliser function comme ceci:

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)