Шаблон h::t
сопоставляет начало и конец списка с переменными h
и t
. Поэтому, если я сопоставлю шаблон следующим образом:
match [1; 2; 3] with
| h::t -> (* Some code... *)
h
будет иметь значение 1
, а t
будет иметь значение [2; 3]
.
::
является конструктором . Сопоставление с образцом в этом образце сопоставляется с конструкторами. Они создают новый тип данных из двух значений. ::
является конструктором, а его тип, list
, является рекурсивным. Вот примерное определение типа list
:
type 'a list =
| []
| (::) 'a ('a list)
;;
Таким образом, тип list
является рекурсивным, потому что его конструктор, ::
, вызывает сам себя.
Честно говоря, я мог бы написать половина книги в списках. Они - хлеб с маслом функциональных языков программирования.
Если вам интересно, почему вы не можете сопоставить шаблоны с операторами , вот почему. Вы не можете сопоставлять шаблоны для операторов, только конструкторы.