34
конструкция 1:x создает новый список, элементами которого будут
числа 1, 2, 3, 4. На самом деле изображение списка в виде
последовательности элементов всегда можно записать с помощью
конструктора списков. Например, список [2, 3, 4] может быть
записан в виде 2:(3:(4:[])). В этом примере круглые скобки
необязательны, так как построение списка происходит «справа налево»,
то
есть от последнего элемента к первому. В этой записи использована также
константа [], изображающая пустой список.
Конструктор списков – это не совсем обычная операция. Она
отличается от, скажем, операции арифметического сложения целых тем,
что не «вычисляет» никакого нового значения, а просто собирает сложный
объект из более простых. Эти более простые объекты
остаются в составе
списка неизменными, их можно извлечь оттуда и обрабатывать отдельно, в
то время как после сложения числа 3 с числом 5 получается новый объект
– число 8, в состав которого никоим образом не входят ни тройка, ни
пятерка. Такие операции, которые лишь соединяют объекты в новый
составной объект, вообще в функциональном программировании
называются конструкторами, и конструктор списков – это лишь частный
случай более общего понятия конструктора. В дальнейшем мы увидим, что
изображения константных значений (литералы) также можно
рассматривать как конструкторы, создающие элементарные объекты.
Таким образом, список, заданный перечислением своих элементов, может
быть также задан с помощью применения двух конструкторов – двоеточия
и пустого списка.
Для того, чтобы писать программы обработки списков, надо
научиться извлекать отдельные элементы списка. Это можно делать либо с
помощью встроенных операций, позволяющих извлечь отдельные
составные части списка, либо с помощью аппарата сопоставления с
образцом. Давайте сначала рассмотрим первый способ.
Имеется много встроенных в язык операций обработки списков. Вот
важнейшие из них
:
head, last – функции, которые по заданному аргументу-списку
выдают его первый и последний элементы соответственно. Операции
применимы только к непустому списку.
tail – функция, выдающая остаток списка, полученный отбрасыванием
первого элемента. Аналогично, функция init выдает список без
последнего элемента. Обе операции также неприменимы к пустому
списку.
!! – операция, которая по списку и
заданному номеру элемента выдает
соответствующий элемент списка. Список должен быть непустым, а
номер должен лежать в пределах от нуля (первый элемент списка имеет
номер ноль) до количества элементов списка без единицы. Например,