Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Funktsionalnoe_i_logicheskoe_programmirovanie.doc
Скачиваний:
32
Добавлен:
19.01.2023
Размер:
1.75 Mб
Скачать

1.3. Простейшие генераторы списков.

В языке Haskell существует очень удобный инструмент – генератор списков. Представим себе ситуацию, что ваша функция должна принимать в качестве входного аргумента список первых ста натуральных чисел. Согласитесь, что вводить этот список вручную при каждом запуске программы дело очень трудоёмкое. В Haskell достаточно в этом случае указать первый и последний элементы списка, а между ними записать две точки. Списки в Haskell заключаются в квадратные скобки. Ниже показан пример получения списка первых десяти натуральных чисел:

.

Задавать таким образом можно даже бесконечные списки, достаточно не указывать последний элемент списка. Но в этом случае придется принудительно вызывать остановку программы нажатием вот этой кнопки на панели слева . В примере ниже показаны только две строчки бесконечного списка:

.

Можно генерировать не обязательно подряд идущие числа. Если в начале списка указать через запятую два числа, то программа будет генерировать арифметическую прогрессию с первым членом равным первому числу и разностью равной разности между первым и вторым числом. При этом последнее число, заданное после двух точек понимается как граница - последним в списке будет член прогрессии, не превосходящий заданного последнего числа:

.

Последовательности чисел более сложного вида, чем арифметическая прогрессия тоже можно получать с помощью генератора списков. Если элемент последовательности выражается какой либо формулой в зависимости от номера, следует писать так: [f(n) | n<-[1..]]. Также в такой записи можно указать последний номер элемента, чтобы список не был бесконечным. Например, список квадратов первых 10 натуральных чисел:

.

Можно получать не только числовые списки, но и списки любой структуры. Например, вот список кортежей, содержащий нотации полей шахматной доски:

.

С помощью генератора списков легко можно получать всевозможные перестановки и подмножества заданного множества элементов. Например, если требуется найти все «слова» длины 3, состоящие из букв слова «HELLO», то следует написать:

Если нас не устраивают повторяющиеся «слова», достаточно применить функцию nub, которая удаляет из списка одинаковые элементы. Так как функция определена в модуле List, не забываем предварительно подключить этот модуль:

Вообще в генераторе списков можно через запятую перечислять любые условия на элементы списка. Например, если требуется получить все тройки натуральных чисел, дающих в сумме 15, можно написать так:

1.4 Логические функции, функции сравнения, функции работы с перечислимыми типами данных.

В Haskell имеется булевский тип данных, обозначаемый Bool. К этому типу принадлежат два значения True и False, соответствующие, как легко догадаться, истине и лжи. Из логических функций в Haskell имеются not, && и ||, соответствующие отрицанию, конъюнкции и дизъюнкции. Другие же логические функции можно выразить через эти три. Но тут есть маленькие хитрости, позволяющие пойти более простым путем. Сначала упомянем функции сравнения, они имеют обычный математический смысл:

  • < - меньше

  • > - больше

  • == - равно

  • /= - не равно

  • >= - не менее

  • <= - не более.

Теперь поясним, как можно с помощью функций сравнения выразить некоторые другие логические операции. Эквивалентность достаточно заменить сравнением на равенство, сумму по модулю 2 ( исключающее «или») сравнением на неравенство. Импликацию же оказывается можно заменить сравнением «не более». Дело в том, что булевский тип данных у нас перечислимый, то есть, определен четкий порядок перечисления данных этого типа. А именно, значение False идет раньше значения True. Импликация должна принимать ложное значение, только если первый аргумент True, а второй False. Но именно в этом случае сравнение True<=False даст в результате ложь, а во всех остальных случаях результатом будет истина.

Приведем еще несколько функций для работы с упорядоченными и перечислимыми типами данных.

Табл. 1.2 Функции работы с упорядоченными и перечислимыми типами

Описание

Имя функции

Пример

Примечание

Максимум из двух значений

max

Минимум из двух значений

min

Предыдущее значение

pred

может вызвать ошибку времени выполнения, если значение наименьшее из возможных

Последующее значение

succ

может вызвать ошибку времени выполнения, если значение наибольшее из возможных