Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MakeevGA-Haskell-a4-shortcode_2014_05_31.doc
Скачиваний:
15
Добавлен:
19.01.2023
Размер:
1.79 Mб
Скачать

Лабораторная работа 2 Символьные функции

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных:

isUpper, isLower, isAlpha, isDigit, toUpper, toLower

ord, chr

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных, и напишите свою реализацию каждой функции под другим именем:

digitToInt

intToDigit

Напишите функции hexToDecMy :: String -> Integer, decToHexMy :: Integer -> String, преобразующие десятичное число в 16-ричное и наоборот. Обратите внимание, что стандартные функции digitToInt и intToDigit работают и с десятеричными цифрами тоже.

Напишите функции romanToArabMy :: String -> Integer, arabToRomanMy :: Integer -> String, преобразующие десятичное число в обычной записи в запись в римских цифрах и наоборот.

Простейшие кортежные функции

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных:

fst, snd

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных, и напишите свою реализацию каждой функции под другим именем:

zip, unzip

Теоретико-множественные операции

Напишите функцию nub :: Eq a => [a] -> [a], удаляющую дубликаты из списка.

Напишите функцию delete :: Eq a => a -> [a] -> [a], удаляющую первое вхождение заданного элемента из списка.

Напишите функцию union :: Eq a => [a] -> [a] -> [a], объединяющую два списка, как если бы это были множества.

Напишите функцию (\\) :: Eq a => [a] -> [a] -> [a], вычитающую из первого списка второй, как если бы это были множества.

Напишите функцию intersect :: Eq a => [a] -> [a] -> [a], находящую пересечение двух списков, как если бы это были множества.

Булеаном множества называется множество всех подмножеств этого множества. Напишите функцию powersetMy :: [a] -> [[a]], находящую булеан заданного списка, как если бы это было множество.

Напишите функцию complementsMy :: [a] -> [([a],[a])], находящую множество разбиений множества на подмножество и его дополнение до исходного множества.

Сортировка

Напишите функции sort :: Ord a => [a] -> [a], insert :: Ord a => a -> [a] -> [a], соответственно, сортирующие список по возрастанию и вставляющие элемент в отсортированный список.

Напишите функцию countCharsMy :: String -> [(Char,Int)], которая подсчитывает количество вхождений каждого символа в строку и выводит список кортежей, отсортированный по убыванию второго элемента кортежа. Например, countChars “hello” = [(‘l’,2), (‘h’,1), (‘e’,1), (‘o’,1)].

Вспомогательные функции

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных:

show, read, error, undefined

lines, unlines

words, unwords

Отладка

Подключите к какому-нибудь из своих модулей модуль Trace. Запросите в интерпретаторе, объясните тип и проверьте поведение на примерах входных данных для функции trace. Используйте trace в какой-нибудь из ваших рекурсивных функций и понаблюдайте за результатами.

Лабораторная работа 3

Списочные функции высших порядков

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных, и напишите свою реализацию каждой функции под другим именем:

map, filter, any, all

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных:

zipWith, (.), ($), flip, id, const

curry, uncurry

splitAt, takeWhile, dropWhile

span, break, until

concatMap

foldl, foldl1

scanl, scanl1

foldr, foldr1

scanr, scanr1

Напишите функцию String -> String, удаляющую из строки все гласные буквы с помощью функций filter и elem.

Напишите функцию String -> String, удаляющую из строки все согласные буквы с помощью функций filter и elem.

Напишите функцию String -> String, удаляющую из строки все цифры с помощью функций filter и elem.

Напишите функцию [String] -> String, берущую список строк и возвращающую строку, состоящую из первых букв каждой строки с помощью функций map и head.

Напишите функцию [[a]] -> [a], берущую список списков и возвращающую список из последних элементов подсписков с помощью функций map и last. Проверьте на примере строк.

Напишите функцию [[a]] -> Int -> [a], берущую список списков и возвращающую список из N-х элементов подсписков с помощью функций map и (!!). Проверьте на примере строк.

Напишите функцию [[a]] -> [[a]], берущую список списков и обращающая исходный список и все его подсписки с помощью функций map и reverse.

Напишите функцию mapIfMy :: (a -> Bool) -> (a -> b) -> (a -> b) -> [a] -> [b], берущую условие cond, функции f1 и f2 и список xs, и обрабатывающую, подобно map список xs, применяя к очередному элементу функцию f1, если условие cond на этом элементе равно True, и применяя функцию f2 в обратном случае.

Напишите функцию composeAllMy :: [a -> a] -> (a -> a), берущую список функций и возвращающую функцию, являющуюся их последовательной композицией.

Напишите функцию applyIterateMy :: [a -> a] -> a -> a, берущую список функций и применяющую эти функции последовательно к исходному значению, также переданному в функцию. Объясните разницу между этой функцией и предыдущей.

Напишите функцию partition :: (a -> Bool) -> [a] -> ([a], [a]), берущую предикат и список, и возвращающую кортеж из списков элементов, на которых предикат вернул True и False соответственно.

Напишите функцию [a -> Bool] -> a -> Int, берущую список предикатов и элемент, и находящую, сколько предикатов на этом элементе возвращают True.

Напишите функцию findIndices :: (a -> Bool) -> [a] -> [Int], находящую индексы тех элементов в списке, на которых условие возвращает True.

Напишите функцию sortBy :: (a -> a -> Ordering) -> [a] -> [a], сортирующую элементы в списке по переданной сортировочной функции.

Напишите функцию on :: (b -> b -> c) -> (a -> b) -> a -> a -> c, которая берет бинарную функцию fb и унарную функцию fa, и возвращает бинарную функцию. Например, применение функции on к умножению и какой-то функции f может выглядеть так: (*) `on` f должно возвращать функцию \x y -> f x * f y.

Примените функцию on совместно с sortBy, например: sortBy (compare `on` fst) some_list_of_tuples, приведите другие примеры.

Напишите функцию filterMapAndMy :: [a -> Bool] -> [a] -> [a], которая выбирает только те элементы из списка, на которых все функции из списка функций возвращают True. Например, filterMapAndMy [even, >5, <10] [1..20] = [6,8].

Напишите функцию filterMapOrMy :: [a -> Bool] -> [a] -> [a], которая выбирает только те элементы из списка, на которых хотя бы одна функция из списка функций возвращает True. Например, filterMapOrMy [even, >5] [1..10] = [2,4,6,7,8,9,10].

Напишите функцию sumEqMy :: [[Int]] -> [Int], которая по списку списков чисел строит список чисел, получающийся при сложении всех списков выписанных один под другим "столбиком" с выравниванием по первому элементу каждого списка.

например, sumEqMy [[1],[2,2],[3,3,3,3]] = [6,5,5,3,3].

Напишите функции mapAccumLMy (или mapAccumRMy) :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y]), которая ведет себя как комбинация map и foldl (или foldr): если функция map применяет к каждому элементу функцию (x -> y), то эта должна применять функцию (acc -> x -> (acc, y)), передавая от элемента к элементу слева направо (справа налево) некоторое состояние acc. Напишите пример применения. Сравните со стандартными функциями scanl и scanr.

Напишите функцию segregateFMy :: [a -> Bool] -> a -> ([a -> Bool] , [a -> Bool]), которая берет список функций и определенное значение и возвращает кортеж из двух списков функций. В первом элементе кортежа должен оказаться список функций, которые возвращают True, а во втором элементе кортежа – список тех функций, которые возвращают False. Например, segregateFMy [odd,even,(>5),(<4),(>1)] 6 = ([even,(>5),(>1)] , [odd,(<4)]).