Согласно этой статье , в которой на самом деле есть конкретный пример, который вы обсуждаете:
Как мы видели, список может быть либо пустым (список имеет форму []
), либо состоять из первого элемента (его голова) и подсписка (его хвост). Список тогда имеет вид h::t
.
Приведенный оператор просто дает 0, если список соответствует пустому списку или использует сопоставление с образцом для извлечения головы (первый элемент) и хвоста (все остальные элементы), а затем использует рекурсию для получения длины хвоста.
Итак, _::tail
уменьшает список, а 1 + (size tail)
вычисляет размер. Бит перед |
является, конечно, завершающим условием для рекурсии.
Это может быть более понятно (на мой взгляд), если рассматривать как:
let rec size x = match x with
[] -> 0
| _::tail -> 1 + (size tail)
;;
(на самом деле это очень похоже на формат, используемый на связанной странице, я просто немного изменил его, чтобы выстроить в ряд символы ->
).