
- •Оглавление
- •От автора
- •Структура
- •Пояснения и обозначения
- •Демонстрация кунг-фу
- •Теория Основные понятия и типы данных
- •Кортежи
- •Функции, операторы
- •Полиморфные типы данных
- •Чтение сигнатур типов
- •Простейшие функции и операторы
- •Арифметические функции
- •Логические функции
- •Списочные функции
- •Кортежные функции
- •Создание своих функций
- •Способ 1. Определение функции как выражения от параметров:
- •Способ 2. Несколько определений одной функции:
- •Способ 3. Определение функции через синоним:
- •Способ 4. Лямбда функция (анонимная функция):
- •Способ 5. Частичное применение функции:
- •Образцы и сопоставление с образцом
- •Синтаксический хлеб и синтаксический сахар
- •Условия и ограничения
- •Локальные определения
- •Двумерный синтаксис
- •Арифметические последовательности
- •Замыкания списков
- •Функциональное мышление
- •Рекурсия как основное средство
- •Ручная редукция выражений
- •Думаем функционально, шаг раз
- •Думаем функционально, шаг два: аккумуляторы
- •Реализация простейших списочных и прочих функций
- •Думаем функционально, шаг три: хвостовая рекурсия
- •Еще раз о рекурсии
- •Полезные хитрости языка
- •Ленивые вычисления и строгие функции
- •Бесконечные списки
- •Функция show
- •Совсем немного о классах
- •Функция read
- •Функция error
- •Побочные эффекты и функция trace
- •Функции высших порядков
- •Мотивация
- •Функция map
- •Функция filter
- •Композиция функций
- •Функция foldr
- •Функция foldl
- •Свертки: разбор полетов
- •Выявление общей функциональности
- •Стандартные функции высших порядков
- •Еще немного про строгие функции
- •Создание своих типов данных
- •Простые перечислимые типы данных
- •Контейнеры
- •О сравнении, отображении и прочих стандартных операциях
- •Параметрические типы данных
- •Сложные типы данных
- •Тип данных Maybe
- •Рекурсивные типы данных: списки
- •Рекурсивные типы данных: деревья
- •Ввод-вывод
- •Простейший ввод-вывод
- •Объяснение кухни
- •Пример программы, производящей нетривиальное преобразование текстового файла
- •Пример решения задачи: Поиск в пространстве состояний
- •Через массивы и последовательность промежуточных состояний
- •Решение для тех, кто не хочет разбираться сам
- •Через списки, лог истории и уникальную очередь
- •Решение для тех, кто не хочет разбираться сам
- •Задачник
- •Пояснения и обозначения
- •Лабораторная работа 1 Простейшие функции
- •Простейшие логические функции
- •Простейшие списочные функции
- •Лабораторная работа 2 Символьные функции
- •Простейшие кортежные функции
- •Теоретико-множественные операции
- •Сортировка
- •Арифметические последовательности
- •Генераторы списков
- •Лабораторная работа 4 Бесконечные списки
- •Ввод-вывод
- •Нетривиальные функции
- •Лабораторная работа 5 Простые числа и факторизация
- •Деревья
- •Деревья вычислений
- •Дополнительные задания для самостоятельной работы Задания с Project Euler
- •Простейший инструментарий Установка WinHugs и начало работы
- •Работа с интерпретатором WinHugs в интерактивном режиме
- •Команды интерпретатору
- •Работа с модулями
- •Список рекомендуемой литературы и электронных ресурсов
Арифметические последовательности
Запросите в интерпретаторе и объясните тип выражений и результат их вычисления:
[1..10]
[2,4..11]
[1..]
[1,5..]
['a'..'z']
Генераторы списков
Вычислите выражения и объясните результат их вычисления:
squares [1..10] where squares xs = [x^2 | x <- xs]
[x^2 | x <- [1..10], odd x]
[(x,y) | x <- [1..10], y <- ['a'..'d']]
Напишите с помощью генераторов списков функцию [Integer] -> [(Integer, Integer)], которая из списка [Integer] формирует список всевозможных пар чисел из этого списка, таких что первое число меньше второго. Напишите аналогичную функцию без использования генераторов списков.
Лабораторная работа 4 Бесконечные списки
Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных, и напишите свою реализацию каждой функции под другим именем:
iterate, repeat, cycle
Научитесь работать с бесконечными арифметическими последовательностями вида [N..] и [N,K..], а так же строить на их основе бесконечные списки.
Напишите с помощью функции iterate функцию pseudoRandomMy :: Integer -> [Integer], строящую бесконечный список псевдослучайных чисел в соответствии с линейным конгруэнтным методом.
Напишите функцию, строящую бесконечный список символов, получающихся последовательной записью натуральных чисел: ['1','2','3','4','5','6','7','8','9','1','0','1','1', '1','2',…], и проверьте ее, выведя первые сто символов, а также тысячный символ. Используйте бесконечный список [1..] и функции map и show.
Напишите функцию, строящую бесконечный список символов, получающихся конкатенацией текстовых записей степеней десятки ['1','0','1','0','0','1','0','0','0',…], и проверьте ее, выведя первые сто символов, а также тысячный символ. Используйте функции iterate и show.
Напишите функцию, строящую бесконечный список чисел, у которых сумма чисел равна их произведению и вывести первые 10 его элементов, а так же найти максимальный номер, который ваша реализация и ваша система позволяет найти за разумное время.
Напишите функцию, строящую бесконечный список степеней двойки, у которых сумма чисел нечетная и вывести 10 первых элементов, а так же найти максимальный номер, который ваша реализация и ваша система позволяет найти за разумное время.
Напишите функцию, строящую бесконечный список подсписков чисел: в первом подсписке будут степени единицы, во втором степени двойки, в третьем – тройки и так далее: [[1,1,1,…],[2,4,8,…],[3,9,27,…],…].
Ввод-вывод
Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных:
putChar, putStr, putStrLn, print
getChar, getLine
readFile, writeFile
interact
Напишите функцию, которая читает входной текстовый файл и проверяет, правильно ли в тексте расставлены скобки (для каждой открывающей есть своя правильная закрывающая).
Напишите функцию, которая читает входной текстовый файл и выводит в выходной файл пары (слово:число), где слово – есть каждое уникальное слово файла, а число – количество вхождений этого слова. Пары должны быть отсортированы по убыванию чисел. Постарайтесь использовать как можно больше уже написанных функций.
Напишите функцию, которая читает входной текстовый файл и выводит в выходной файл пары (буква:число), где буква – есть каждая возможная буква (возможно не встречающаяся даже в файле), а число – количество вхождений этой буквы. Пары должны быть отсортированы по убыванию чисел.
Напишите функцию, которая читает входной текстовый файл и выводит в выходной файл отсортированные по возрастанию все уникальные слова этого текста без учета регистра
Напишите функцию, которая читает входной текстовый файл и заданное слово, и выводит в выходной файл только те строки входного файла, где содержится это слово.