В дополнение к ответу Брайана, есть несколько моментов, на которые стоит обратить внимание. Синтаксис h::t
может использоваться как оператор и как шаблон:
let l = 1::2::[] // As an operator
match l with x::xs -> 1 | [] -> 0 // As a pattern
Это означает, что это немного особая конструкция, потому что другие операторы (например, +
) не могут использоваться в качестве шаблонов (для разложения результата обратно на аргументы оператора) - очевидно, для +
это было бы неоднозначно.
Также интересен шаблон [_]
, поскольку он является примером вложенного шаблона. Составляет:
_
- Подчеркнуть шаблон, который соответствует любому значению и не связывает никакие символы
[ <pattern> ]
- Шаблон списка из одного элемента, который сопоставляет списки с одиночными элементами и сопоставляет элемент списка с вложенным <pattern>
.
Вы также можете написать match 1::[] with | [x] -> x
, который будет возвращать значение одного элемента (в данном случае 1).