
- •Оглавление
- •От автора
- •Структура
- •Пояснения и обозначения
- •Демонстрация кунг-фу
- •Теория Основные понятия и типы данных
- •Кортежи
- •Функции, операторы
- •Полиморфные типы данных
- •Чтение сигнатур типов
- •Простейшие функции и операторы
- •Арифметические функции
- •Логические функции
- •Списочные функции
- •Кортежные функции
- •Создание своих функций
- •Способ 1. Определение функции как выражения от параметров:
- •Способ 2. Несколько определений одной функции:
- •Способ 3. Определение функции через синоним:
- •Способ 4. Лямбда функция (анонимная функция):
- •Способ 5. Частичное применение функции:
- •Образцы и сопоставление с образцом
- •Синтаксический хлеб и синтаксический сахар
- •Условия и ограничения
- •Локальные определения
- •Двумерный синтаксис
- •Арифметические последовательности
- •Замыкания списков
- •Функциональное мышление
- •Рекурсия как основное средство
- •Ручная редукция выражений
- •Думаем функционально, шаг раз
- •Думаем функционально, шаг два: аккумуляторы
- •Реализация простейших списочных и прочих функций
- •Думаем функционально, шаг три: хвостовая рекурсия
- •Еще раз о рекурсии
- •Полезные хитрости языка
- •Ленивые вычисления и строгие функции
- •Бесконечные списки
- •Функция show
- •Совсем немного о классах
- •Функция read
- •Функция error
- •Побочные эффекты и функция trace
- •Функции высших порядков
- •Мотивация
- •Функция map
- •Функция filter
- •Композиция функций
- •Функция foldr
- •Функция foldl
- •Свертки: разбор полетов
- •Выявление общей функциональности
- •Стандартные функции высших порядков
- •Еще немного про строгие функции
- •Создание своих типов данных
- •Простые перечислимые типы данных
- •Контейнеры
- •О сравнении, отображении и прочих стандартных операциях
- •Параметрические типы данных
- •Сложные типы данных
- •Тип данных Maybe
- •Рекурсивные типы данных: списки
- •Рекурсивные типы данных: деревья
- •Ввод-вывод
- •Простейший ввод-вывод
- •Объяснение кухни
- •Пример программы, производящей нетривиальное преобразование текстового файла
- •Пример решения задачи: Поиск в пространстве состояний
- •Через массивы и последовательность промежуточных состояний
- •Решение для тех, кто не хочет разбираться сам
- •Через списки, лог истории и уникальную очередь
- •Решение для тех, кто не хочет разбираться сам
- •Задачник
- •Пояснения и обозначения
- •Лабораторная работа 1 Простейшие функции
- •Простейшие логические функции
- •Простейшие списочные функции
- •Лабораторная работа 2 Символьные функции
- •Простейшие кортежные функции
- •Теоретико-множественные операции
- •Сортировка
- •Арифметические последовательности
- •Генераторы списков
- •Лабораторная работа 4 Бесконечные списки
- •Ввод-вывод
- •Нетривиальные функции
- •Лабораторная работа 5 Простые числа и факторизация
- •Деревья
- •Деревья вычислений
- •Дополнительные задания для самостоятельной работы Задания с Project Euler
- •Простейший инструментарий Установка WinHugs и начало работы
- •Работа с интерпретатором WinHugs в интерактивном режиме
- •Команды интерпретатору
- •Работа с модулями
- •Список рекомендуемой литературы и электронных ресурсов
Лабораторная работа 5 Простые числа и факторизация
Напишите функцию primesMy :: [Integer], строящую бесконечный список простых чисел. Найдите максимально большое простое число, которое ваша система позволяет найти за разумное время.
Напишите функцию factorizeMy :: Integer -> [Integer], которая разлагает заданное число на простые множители, возвращая список степеней при простых множителях. Например, раз 350 == 21*30*52*71, то factorizeMy 350 == [1,0,2,1].
Напишите функцию defactorizeMy :: [Integer] -> Integer, которая собирает обратно число, разложенное на простые множители. Например, defactorizeMy [1,0,2,1] == 350.
Напишите реализацию функций gcd и lcm с помощью factorizeMy и defactorizeMy.
Деревья
Определите тип данных дерева: data Tree a = Leaf a | Branch (Tree a) (Tree a) deriving Show, запросите и объясните тип функций-конструкторов-данных Leaf и Branch, постройте с помощью этих функций простейшие деревья. Объясните, какие деревья можно представить такой структурой данных, а какие нельзя.
Определите тип данных дерева: data Tree a = Empty | Branches a [Tree a] deriving Show, запросите и объясните тип функций-конструкторов-данных Empty и Branches, постройте с помощью этих функций простейшие деревья. Объясните, какие деревья можно представить такой структурой данных, а какие нельзя.
Напишите функцию fringeMy :: Tree a -> [a], возвращающую в произвольном порядке все листья дерева.
Напишите функцию mapTreeMy :: (a -> b) -> Tree a -> Tree b, применяющую к каждому элементу дерева заданную функцию без изменения структуры самого дерева.
Напишите функцию depthMy :: Tree a -> Integer, находящую глубину дерева – количество поддеревьев на пути к самой глубокой вершине.
Напишите функцию dfsMy :: Tree a -> [a], возвращающую все вершины дерева в порядке обхода дерева в глубину.
Напишите функцию bfsMy :: Tree a -> [a], возвращающую все вершины дерева в порядке обхода дерева в ширину.
Напишите функцию showTreeMy :: Tree a -> String, возвращающую текстовое представление дерева в виде последовательности строк с отступами (примерно как команда tree в командной строке MS Windows).
Определите тип данных для бинарного поискового дерева: data Ord a => SearchTree a = Empty | Branches a (SearchTree a) (SearchTree a) deriving (Show, Eq), запросите и объясните тип функций-конструкторов-данных Empty и Branches, постройте с помощью этих функций простейшие деревья.
Напишите функцию elemTreeMy :: Ord a => SearchTree a -> Bool, проверяющую правильность бинарного поискового дерева.
Напишите функцию checkTreeMy :: Ord a, Eq a => a -> SearchTree a -> Bool, проверяющую, есть ли конкретный элемент в дереве.
Напишите функцию putValMy :: Ord a => a -> SearchTree a -> SearchTree a, добавляющую в правильное бинарное поисковое дерево очередной элемент в нужное место.
Напишите функцию list2treeMy :: Ord a => [a] -> SearchTree a, создающую из пустого дерева правильное поисковое дерево путем добавления в дерево последовательно всех элементов списка.
Напишите функцию heightMy :: Ord a => SearchTree a -> Integer, находящую глубину дерева.
Напишите функцию checkhMy :: Ord a => SearchTree a -> Bool, проверяющую, является ли текущее бинарное поисковое дерево идеально сбалансированным.
Напишите функцию balanceMy :: Ord a => SearchTree a -> SearchTree a, создающую из поискового дерева идеально сбалансированное дерево.
Объясните, что вычисляет выражение and $ map checkhMy $ map balanceMy $ map list2treeMy $ permutations "abcdefgh".