2010-08-28 5 views
8

Есть ли эквивалент OCaml для соответствия шаблону Haskell на произвольном количестве аргументов? Например, я могу иметь что-то похожее:Как сопоставить шаблон по произвольному числу аргументов?

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 

(Пример приподнялся от Разработки приложений с Objective Caml :)

Спасибо.

+1

Я бы не сказал, что ваш пример принимает произвольное количество аргументов, функция принимает ровно два аргумента. – adamse

+0

adamse: true, но мой вопрос относится к любой функции, принимающей более одного аргумента. –

ответ

14

Вы не можете соответствовать несколько аргументов как таковой, но вы можете сопоставить кортежи, так что вы можете сделать:

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 

Если вы нормально с функцией принимать аргументы в виде кортежа вы также можете использовать function вот так:

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) 
Смежные вопросы