Простейшие генераторы списков.
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; просмотров: 311; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!