- •Лабораторная работа №3 «программирование пользовательских функций»
- •Общие положения
- •Типы функций
- •Карринг и кортежи (tuples)
- •Префиксная и инфиксная запись
- •Переменные
- •Конструкции let и where
- •Условные выражения
- •Операция выбора и правила выравнивания
- •Сопоставление с образцом
- •Безразличные аргументы
- •Охраняемые образцы (образцы с условиями)
- •Функции высших порядков
- •Примеры функций
- •Лабораторная работа №4
Примеры функций
Функция вычисления длины списка:
len [] = 0
len s = 1 + len (tail s)
Вспомним, что список, первым элементом которого (головой) является х, а остальные элементы (хвост) задаются списком xs, записывается как x:xs. Оказывается, подобную конструкцию можно применять при описании функции:
len [] = 0
len (x:xs) = 1 + len xs
Строку xs следует понимать, как множественное число от х.
2. Функция суммирования двух первых элементов списка:
f1 (x:y:xs) = x + y
3. Определение функции, аналогичной head
my_head (x:xs) = x
4. Определение функции, аналогичной tail
my_tail (_:xs) = xs
5. Функция извлечения первого элемента тройки
fst3 (x,_,_) = x
Можно задавать довольно сложные образцы. Определим функцию, принимающую список пар чисел и возвращающую сумму их разностей (т.е. f [(x1,y1),(x2,y2), …, (xn,yn)] = (x1 – y1) + (x2-y2) + … + (xn - yn)):
f [] = 0
f((x,y):xs) = (x-y) + f xs
Функции работы со списками:
☼ Вычисление длины списка.
length :: [t] -> Int
length [] = []
length (x:xs) = 1 + length xs
☼ Получение головы списка
head :: [a] -> a
head (x : _) = x
head [] = error "head : empty list!"
☼ Хвост списка
tail :: [a] -> [a]
tail (_:xs) = xs
tail [] = error "tail : empty list!"
☼ Последний элемент списка
last :: [a] -> a
last [x] = x
last (_:xs) = last xs
last [] = error "last : empty list!"
☼ Проверка списка на пустоту
null :: [a]->Bool
null [] = True
null (_:_) = False
Копирование списка (тождественное преобразование)
copy :: [a]->[a]
copy [] = []
copy (x:xs) = x : copy xs
Объединение двух списков
append :: [a]->[a]->[a]
append [] ys = ys
append (x:xs) ys = x : append xs ys
☼ xs++ys ≡ append xs ys
Обращение списка (изменение порядка элементов на обратный)
rev :: [a]->[a]
rev [] = []
rev (x:xs) = (rev xs)++ys
rev2 :: [a]->[a]->[a]
rev2 [] ys = ys
rev2 (x:xs) ys = rev2 xs (x:ys)
☼ reverse xs = rev2 xs []
☼ Получить первые n элементов списка
take :: Int -> [a] -> [a]
take n _ | n <= 0 = []
take _ [] = []
take n (x:xs) = x : take (n-1) xs
Получить n-ый элемент списка
nth :: Int->[a]->a
nth 1 (x:_) = x
nth n (x:xs) | n>1 = nth (n-1) xs
nth _ _ = error “nth: error…”
Вставка элемента в упорядоченный (отсортированный) список
insert :: Int->[Int]->[Int]
insert n [] = [n]
insert n (x:xs) = if n<=x then n:x:xs else x : insert n xs
insert n [] = [n]
insert n (x:xs) | n<=x = n:x:xs else x : insert n xs
insert n (x:xs) | n>x = insert n xs
Объединение двух упорядоченных списков
appendsort :: [Int]->[Int]->[Int]
appendsort xs [] = xs
appendsort (x:xs) ys = insert x (appendsort xs ys)
Индивидуальные задания к лабораторной работе:
Функция max3, по трем целым возвращающая наибольшее из них.
Функция min3, по трем целым возвращающая наименьшее из них.
Функция sort2, по двум целым возвращающая пару, в которой наименьшее из них стоит на первом месте, а наибольшее – на втором.
Функция bothTrue :: Bool -> Bool -> Bool, которая возвращает True тогда и только тогда, когда оба ее аргумента будут равны True. Не используйте при определении функции стандартные логические операции (&&, || и т.д.).
Функция solve2 :: Double -> Double -> (Bool, Double), которая по двум числам, представляющим собой коэффициенты линейного уравнения ax + b = 0, возвращает пару, первый элемент которой равен True, если решение существует и False в противном случае; при этом второй элемент равен либо значению корня, либо 0.0.
Функция isParallel, возвращающая True, если два отрезка, концы которых задаются в аргументах функции, параллельны (или лежат на одной прямой). Например, значение выражения isParallel (1, 1) (2, 2) (2, 0) (4, 2) должно быть равно True, поскольку отрезки (1, 1) - (2, 2) и (2, 0) - (4, 2) параллельны.
Функция isIncluded, аргументами которой служат параметры двух окружностей на плоскости (координаты центров и радиусы); функция возвращает True, если вторая окружность целиком содержится внутри первой.
Функция isRectangular, принимающая в качестве параметров координаты трех точек на плоскости, и возвращающая True, если образуемый ими треугольник – прямоугольный.
Функция isTriangle, определяющая, можно ли из отрезков с заданными длинами x, y и z построить треугольник.
Функция isSorted, принимающая на вход три числа и возвращающая True, если они упорядочены по возрастанию.
