Следующий фрагмент кода взят с официального сайта OCaml :
# let rec compress = function
| a :: (b :: _ as t) -> if a = b then compress t else a :: compress t
| smaller -> smaller;;
val compress : 'a list -> 'a list = <fun>
Вышеприведенная функция «сжимает» список с последовательными дублирующимися элементами, например:
# compress ["a";"a";"a";"a";"b";"c";"c";"a";"a";"d";"e";"e";"e";"e"];;
- : string list = ["a"; "b"; "c"; "a"; "d"; "e"]
У меня дьявольское время, чтобы понять логику вышеприведенного кода.Я привык к обязательному кодированию, поэтому этот рекурсивный, функциональный подход в сочетании с лаконичным, но неясным синтаксисом OCamls заставляет меня бороться.
Например, где находится базовый вариант?Это smaller -> smaller
?Я знаю, smaller
- это переменная или идентификатор, но что он возвращает (возвращает даже правильный термин в OCaml для того, что здесь происходит)?
Я знаю, что списки в OCaml являются односвязными, поэтомуМне также интересно, генерируется ли новый список, или элементы существующего списка вырезаются?Поскольку OCaml функционален, я склонен думать, что списки не являются изменяемыми - это правильно?Если вы хотите изменить список, вам, по сути, нужно создать новый список с элементами, которые вы хотите добавить (или с элементами, которые вы хотите обрезать, отсутствуют).Это правильное понимание?