2010-08-28 15 views
8

¿Hay un OCaml equivalente a la coincidencia de patrones de Haskell en un número arbitrario de argumentos? Por ejemplo, puedo tener algo parecido a:cómo emparejar patrones en un número arbitrario de argumentos?

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 

(el ejemplo de la levantada de Desarrollo de aplicaciones con el Objetivo Caml :)

Gracias.

+1

No diría que su ejemplo toma un número arbitrario de argumentos, la función toma exactamente dos argumentos. – adamse

+0

adamse: cierto, pero mi pregunta se aplica a cualquier función que tome más de un argumento. –

Respuesta

14

No puede coincidir con varios argumentos como tal, sino que puede coincidir con tuplas, por lo que puede hacer:

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 estás bien con la función de tomar sus argumentos como una tupla también se puede utilizar function así:

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) 
Cuestiones relacionadas