Шаблон Ocaml, соответствующий нескольким элементам в списке одновременно - PullRequest
8 голосов
/ 23 января 2011

Допустим, у меня есть список типа integer [1;2;3;4;5;6;7;8] и я хочу, чтобы шаблон соответствовал первым трем элементам одновременно.Есть ли способ сделать это без вложенных операторов сравнения?

Например, можно ли это сделать так?

let rec f (x: int list) : (int list) = 
begin match x with
| [] -> []
| [a; b; c]::rest -> (blah blah blah rest of the code here)
end

Я мог бы использовать метод длинных вложений, который будет:1006 *

let rec f (x: int list) : (int list) =
begin match x with
| [] -> []
| h1::t1 ->
  begin match t1 with
  | [] -> []
  | h2::t2 ->
     begin match t2 with
     | [] -> []
     | t3:: h3 ->
        (rest of the code here)
     end
  end
end

Спасибо!

1 Ответ

11 голосов
/ 23 января 2011

Да, вы можете сделать это.Синтаксис выглядит следующим образом:

let rec f (x: int list) : (int list) = 
begin match x with
| [] -> []
| a::b::c::rest -> (blah blah blah rest of the code here)
end

, но вы заметите, что произойдет сбой, если список содержит менее трех элементов.Вы можете добавить регистры для списков из одного или двух элементов или просто добавить регистр, который соответствует чему-либо:

let rec f (x: int list) : (int list) = 
  match x with
  | a::b::c::rest -> (blah blah blah rest of the code here)
  | _ -> []
...