В "Программирование F #" я столкнулся с подобранным шаблоном (я немного упростил):
let rec len list =
match list with
| [] -> 0
| [_] -> 1
| head :: tail -> 1 + len tail;;
Практически я понимаю, что в последнем матче распознается голова и хвост списка. Понятно, что я не понимаю, почему это работает. Насколько я понимаю,:: - это оператор cons, который добавляет значение в головную позицию списка, но мне не кажется, что он используется в качестве оператора здесь. Должен ли я понимать это как "специальный синтаксис" для списков, где:: интерпретируется как оператор или "шаблон соответствия" в зависимости от контекста? Или может ли распространяться та же идея для типов, отличных от списков, с другими операторами?