2016-02-20 5 views
2

Итак, я пишу простой метод, который суммирует первые 3 или менее ints в списке , но я смущен о шаблонах совпадений.
я в настоящее времяСоответствие шаблону списка OCaml

let sums l = match l with 
    | [] -> 0 
    | (h1::h2::h3::_) -> h1+h2+h3 
    | [h1;h2;h3] -> h1+h2+h3 
    | [h1;h2] -> h1+h2 
    | [h1] -> h1 

ли это охватить все случаи? также как для 3 или более элементов я не могу написать что-то вроде [h1; h2; h3; _]?
Извините, если этот вопрос кажется слишком простым, я только начал изучать OCaml, и я не могу найти что-нибудь подобное в Интернете.

+1

Ocaml даст вам очень явное предупреждение, если он считает, что шаблоны не охватывают все случаи. –

ответ

2

Охватывает ли это все случаи?

Да, они охватывают все случаи, но я бы написать:

let sums l = match l with 
    | [] -> 0 
    | [h1] -> h1  
    | [h1; h2] -> h1+h2 
    | h1 :: h2 :: h3 :: _ -> h1+h2+h3 

Ваш [h1; h2; h3] является излишним, поскольку h1 :: h2 :: h3 :: _ соответствует его (с подстановочные быть [])

также, как прийти на 3 или более элементов, я не могу написать что-то вроде [h1; h2; h3; _]?

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

+0

спасибо, так что всегда лучше сначала сопоставлять случаи с несколькими элементами? – Oxtis

+0

нет. в этом случае разные порядки дают одинаковый код. – objmagic

+0

Технически синтаксис '[h1; h2; h3; _] ', он просто соответствует списку из четырех элементов вместо того, что хочет @Oxtis. – antron

Смежные вопросы