
Министерство образования и науки РФ
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
Язык функционального программирования Haskell
ОТЧЁТ
по дисциплине «Языки программирования»
Выполнил: студент гр. 521
Ингинен А. И.
_________________ 26.12.2012
Проверил: доцент каф. КИБЭВС
Романов А.С.
_________________ 26.12.2012
Томск 2012г
Цель работы: Знакомство с основами функционального программирования на примере языка Haskell.
Задание:
-
Изучить теоретические сведения.
-
Реализовать программу, высчитывающую решение кубического уравнения, на языке функционального программирования Haskell.
-
Написать отчет и защитить у преподавателя.
Теоретический материал:
Программа на функциональном языке программирования состоит из множества определений функций и выражения, чья величина рассматривается как результат программы. Математической моделью функционального программирования является λ-исчисление. Основными языками функционирования в настоящее время являются Lisp и Haskell. В данной лабораторной работе рассматривается интерпретатор Hugs языка Haskell.
Язык Haskell является строго типизированным языком, т.е., как правило, программисту не надо в явном виде определять тип.
Основными типами языка Haskell являются:
1.Integer и Int — для представления целых чисел. Значения типа Integer не ограничены по длине; тип Int представляет целые числа фиксированной длины.
2.Float и Double — для представления вещественных чисел.
3.Bool - для представления результата логических выражений. Может принимать значения True или False.
4.Char - для представления символов. Определить тип можно и вручную, используя оператор
5:: Integer
Интерпретатор Hugs можно использовать для вычисления арифметических выражений. При этом можно использовать операторы +, — , % / с обычными правилами приоритета. Кроме того, можно использовать оператор ^ (возведение в степень). Также можно использовать стандартные математические функции sqrt, sin, cos, tg, exp, log и т.д. Вызов функции выглядит следующим образом (извлечь квадратный корень из 16):
sqrt 16
Кортеж - структура для хранения фиксированного количества разнородных данных. Например, пара ((V, 54), 3.14) принадлежит типу ((Char, Integer), Double). Аналогично можно задавать тройки и т.д., записывая их аналогичным образом.
Для работы с парами используются стандартные функции fst и snd, возвращающие, соответственно, первый и второй элементы пары.
Список - вычислительная структура последовательностей, состоящих из элементов одного типа.
Список можно задать с помощью [ ] или оператора:
[1,2,3] = 1:[2,3]=1:(2:[3])=1:2:[3]=1:(2:(3:[]))=1:2:3:[] Списки могут содержать элементы любого типа: 1:2:3:: [Int] [True,False]:: Bool
С помощью списка можно определить тип String ['а','b','с']:: [Char] = "abc" :: String
Список можно определить с помощью другого списка (с помощью так называемого генератора):
[х*2|х<-[1,2,3,4]]=>[2,4,6,8] ,
Основные функции для работы со списками.
-head возвращает первый элемент списка;
-last возвращает последний элемент списка;
-tail возвращает список без первого элемента;
-ink возвращает список без последнего элемента;
-null проверяет список на пустоту;
-length возвращает длину списка;
-elem проверяет наличие элемента в списке;
-take возвращает список, состоящий из n первых элементов исходного списка;
-zip возвращает список, состоящий из пар объединенных исходных списков;
-!! возвращает элемент, номер которого задан (начиная с 0).
zip [«20», «30»] [1,2,3] Результат выполнения:
[(«20»J),(«30»,2)]:: [([Char,Integer)]
Функция в языке Haskell определяется следующим образом:
square:: Integer — > Integer
square x = x * x
Первая строка объявляет, что мы определяем функцию с именем square, принимающую на вход параметр типа Integer и возвращающую результат типа Integer. Вторая строка является непосредственно определением функции.
Имена пользовательских функций и переменных должны начинаться с латинской буквы в нижнем регистре. Остальные символы в имени могут быть прописными или строчными латинскими буквами, цифрами или символами подчеркивания и апострофом.
Задание:
Решение квадратного уравнения.
solve :: (Floating a) => (a, a, a) -> (a, a)
solve (a, b, c) = (x1, x2)
where
d = b * b - 4 * a * c
sqD = sqrt d
a2 = 2 * a
x1 = (-b + sqD) / a2
x2 = (-b - sqD) / a2
s e = solve (e :: (Float, Float, Float))
Заключение:
В ходе выполнения данной лабораторной работы была реализована программа на языке функционального программирования Haskell.