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



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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!