как сопоставить шаблон с произвольным числом аргументов?

Существует ли OCaml, эквивалентный сопоставлению с образцом Хаскелла по произвольному числу аргументов? Например, могу ли я иметь что-то похожее:

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:»)

Спасибо.

10
задан dcorking 7 August 2016 в 13:02
поделиться

1 ответ

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

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

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

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)
16
ответ дан 3 December 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: