Простейшие генераторы списков.
Nbsp; «Функциональное и логическое программирование» Методические указания к выполнению лабораторных работ
Лабораторная работа 1.
Знакомство с интерпретатором Hugs. Выполнение математических операций в интерпретаторе. Простейшие генераторы списков. Логические функции, функции сравнения, функции работы с перечислимыми типами данных. Простейшие списочные и кортежные функции.
Знакомство с интерпретатором Hugs.
Давайте познакомимся с интерпретатором Hugs, позволяющим выполнять программы, написанные на языке Haskell. Запустив файл winhugs.exe, мы увидим следующее окно:

Строка «Prelude>» означает, что загружен стандартный модуль Prelude, содержащий основные типы данных и функции. Команды (именно команды, а не вызовы функций) интерпретатора начинаются с двоеточия и их список можно посмотреть, набрав «:?»:

Команды, которые нам в дальнейшем понадобятся, это
- :load <filename> - загрузка модуля из файла <filename> .
- :edit <filename> - редактирование модуля в файле <filename> .
- :also <filename> - добавление модуля из файла <filename> . .
Фактически, у нас есть 4 способа выполнения этих команд. Во-первых, можно непосредственно набрать команду в интерпретаторе. Например, команда
:edit “lab3_2.hs”
позволяет перейти к редактированию файла lab3_2.hs в блокноте. Разумеется, для успешного выполнения команды необходимо существование данного файла в текущем каталоге. Во-вторых, можно использовать сокращенный вариант команды, а именно только первую букву. Например, команда
:q
вызовет закрытие интерпретатора. В третьих, команду можно выбрать из меню сверху. Выбор пунктов меню File, затем Open и выбор файла аналогичен команде :load. И, наконец, можно использовать горячие клавиши, расположенные слева. Например, самая верхняя клавиша соответствует открытию файла (загрузке модуля), а седьмая сверху с изображением карандаша приведет к переходу в режим редактирования текущего открытого модуля. Сразу хочется предостеречь от попытки изменить стандартный модуль Prelude, если вы использовали эту клавишу и попали в режим редактирования модуля.
Осталось пояснить команду :also - она будет полезной в том случае, если необходимо в режиме интерпретатора использовать функции из двух или более модулей. Один из модулей надо загрузить, а остальные «присоединить» с помощью этой команды. Например, если уже загружен стандартный модуль Prelude и нам требуются некоторые функции из модуля List, необходимо набрать команду
:а List .
Отметим еще, что для повтора предыдущей команды в интерпретаторе надо нажать стрелку вверх, повторное нажатие будет приводить к появлению более ранних команд.
Выполнение математических операций в интерпретаторе.
Итак, что же можно делать непосредственно в интерпретаторе? Можно, например, вычислять математические выражения. Именно это требуется сделать в 1 задании данной лабораторной работы. Ниже приведена таблица, в которой перечислены основные математические функции модуля Prelude. Следует сказать пару слов о нотации функций в языке Haskell – аргументы функций не требуют заключения в скобки, если только они не являются сложными выражениями, например для вычисления синуса пяти следует писать просто
sin 5,
а не
sin (5),
ошибки в последнем случае не произойдет, но такая запись противоречит «функциональному» стилю. Дробная часть вещественных чисел отделяется при помощи символа точки. Для всех тригонометрических и обратных тригонометрических функций аргументы и результаты подразумеваются в радианах. Для работы с градусами имеется встроенная константа с именем
pi .
Обратите внимание при изучении таблицы, что некоторые функции являются инфиксными, то есть имя функции пишется между аргументами, а некоторые префиксными, то есть имя функции пишется перед аргументом. Если есть необходимость использовать префиксную функцию как инфиксную, то необходимо имя функции заключить между специальными символами:
1 1 ` mod ` 2 .
В случае использования же инфиксной функции в качестве префиксной её можно заключить в круглые скобки:
(+) 2 3
Итак, таблица математических функций:
Таб. 1.1 Математические функции модуля Prelude
| Описание | Имя функции | Пример | Примечание |
| Основные арифметические функции | |||
| Сложение | + |
| |
| Вычитание | - |
| Может использоваться и как унарная операция
|
| Вычитание | subtract |
| Вычитает первый аргумент из второго |
| Умножение | * |
| |
| Деление | / |
| результат всегда имеет тип Double |
| Изменение знака | negate |
| |
| Модуль числа | abs |
| |
| Знак числа | signum |
| |
| Обратная величина | recip |
| |
| Целочисленные арифметические функции | |||
| Целая часть от деления | quot |
| применимо только к положительным аргументам |
| Остаток от деления | rem |
| |
| Целая часть и остаток от деления | quotRem |
| |
| Целая часть от деления | div |
| применимо к аргументам любого знака |
| Остаток от деления | mod |
| |
| Целая часть и остаток от деления | divMod |
| |
| Проверка четности | even |
| |
| Проверка нечетности | odd |
| |
| Наименьшее общее кратное | lcm |
| |
| Наибольший общий делитель | gcd |
| |
| Степенные, показательные и логарифмические функции | |||
| Возведение в степень | ^ |
| оба аргумента типа Int |
| Возведение в степень | ^^ |
| первый аргумент типа Double, второй типа Int |
| Возведение в степень | ** |
| оба аргумента типа Double |
| Арифметический квадратный корень | sqrt |
| |
| Экспонента | exp |
| |
| Натуральный логарифм | log |
| |
| Логарифм | logBase |
| первый аргумент -основание логарифма |
| Тригонометрические функции | |||
| Синус | sin |
| |
| Косинус | cos |
| |
| Тангенс | tan |
| |
| Обратные тригонометрические функции | |||
| Арксинус | asin |
| |
| Арккосинус | acos |
| |
| Арктангенс | atan |
| |
| Гиперболические функции | |||
| Гиперболический синус | sinh |
| |
| Гиперболический косинус | cosh |
| |
| Гиперболический тангенс | tanh |
| |
| Обратные гиперболические функции | |||
| Ареасинус | asinh |
| |
| Ареакосинус | acosh |
| |
| Ареатангенс | atanh |
| |
Простейшие генераторы списков.
В языке Haskell существует очень удобный инструмент – генератор списков. Представим себе ситуацию, что ваша функция должна принимать в качестве входного аргумента список первых ста натуральных чисел. Согласитесь, что вводить этот список вручную при каждом запуске программы дело очень трудоёмкое. В Haskell достаточно в этом случае указать первый и последний элементы списка, а между ними записать две точки. Списки в Haskell заключаются в квадратные скобки. Ниже показан пример получения списка первых десяти натуральных чисел:
.
Задавать таким образом можно даже бесконечные списки, достаточно не указывать последний элемент списка. Но в этом случае придется принудительно вызывать остановку программы нажатием вот этой кнопки на панели слева
. В примере ниже показаны только две строчки бесконечного списка:
.
Можно генерировать не обязательно подряд идущие числа. Если в начале списка указать через запятую два числа, то программа будет генерировать арифметическую прогрессию с первым членом равным первому числу и разностью равной разности между первым и вторым числом. При этом последнее число, заданное после двух точек понимается как граница - последним в списке будет член прогрессии, не превосходящий заданного последнего числа:
.
Последовательности чисел более сложного вида, чем арифметическая прогрессия тоже можно получать с помощью генератора списков. Если элемент последовательности выражается какой либо формулой
в зависимости от номера, следует писать так: [f(n) | n<-[1..]]. Также в такой записи можно указать последний номер элемента, чтобы список не был бесконечным. Например, список квадратов первых 10 натуральных чисел:
.
Можно получать не только числовые списки, но и списки любой структуры. Например, вот список кортежей, содержащий нотации полей шахматной доски:
.
С помощью генератора списков легко можно получать всевозможные перестановки и подмножества заданного множества элементов. Например, если требуется найти все «слова» длины 3, состоящие из букв слова «HELLO», то следует написать:
/
Если нас не устраивают повторяющиеся «слова», достаточно применить функцию nub, которая удаляет из списка одинаковые элементы. Так как функция определена в модуле List, не забываем предварительно подключить этот модуль:
.
Вообще в генераторе списков можно через запятую перечислять любые условия на элементы списка. Например, если требуется получить все тройки натуральных чисел, дающих в сумме 15, можно написать так:

Дата добавления: 2019-03-09; просмотров: 324; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!
