
- •Оглавление
- •От автора
- •Структура
- •Пояснения и обозначения
- •Демонстрация кунг-фу
- •Теория Основные понятия и типы данных
- •Кортежи
- •Функции, операторы
- •Полиморфные типы данных
- •Чтение сигнатур типов
- •Простейшие функции и операторы
- •Арифметические функции
- •Логические функции
- •Списочные функции
- •Кортежные функции
- •Создание своих функций
- •Способ 1. Определение функции как выражения от параметров:
- •Способ 2. Несколько определений одной функции:
- •Способ 3. Определение функции через синоним:
- •Способ 4. Лямбда функция (анонимная функция):
- •Способ 5. Частичное применение функции:
- •Образцы и сопоставление с образцом
- •Синтаксический хлеб и синтаксический сахар
- •Условия и ограничения
- •Локальные определения
- •Двумерный синтаксис
- •Арифметические последовательности
- •Замыкания списков
- •Функциональное мышление
- •Рекурсия как основное средство
- •Ручная редукция выражений
- •Думаем функционально, шаг раз
- •Думаем функционально, шаг два: аккумуляторы
- •Реализация простейших списочных и прочих функций
- •Думаем функционально, шаг три: хвостовая рекурсия
- •Еще раз о рекурсии
- •Полезные хитрости языка
- •Ленивые вычисления и строгие функции
- •Бесконечные списки
- •Функция show
- •Совсем немного о классах
- •Функция read
- •Функция error
- •Побочные эффекты и функция trace
- •Функции высших порядков
- •Мотивация
- •Функция map
- •Функция filter
- •Композиция функций
- •Функция foldr
- •Функция foldl
- •Свертки: разбор полетов
- •Выявление общей функциональности
- •Стандартные функции высших порядков
- •Еще немного про строгие функции
- •Создание своих типов данных
- •Простые перечислимые типы данных
- •Контейнеры
- •О сравнении, отображении и прочих стандартных операциях
- •Параметрические типы данных
- •Сложные типы данных
- •Тип данных Maybe
- •Рекурсивные типы данных: списки
- •Рекурсивные типы данных: деревья
- •Ввод-вывод
- •Простейший ввод-вывод
- •Объяснение кухни
- •Пример программы, производящей нетривиальное преобразование текстового файла
- •Пример решения задачи: Поиск в пространстве состояний
- •Через массивы и последовательность промежуточных состояний
- •Решение для тех, кто не хочет разбираться сам
- •Через списки, лог истории и уникальную очередь
- •Решение для тех, кто не хочет разбираться сам
- •Задачник
- •Пояснения и обозначения
- •Лабораторная работа 1 Простейшие функции
- •Простейшие логические функции
- •Простейшие списочные функции
- •Лабораторная работа 2 Символьные функции
- •Простейшие кортежные функции
- •Теоретико-множественные операции
- •Сортировка
- •Арифметические последовательности
- •Генераторы списков
- •Лабораторная работа 4 Бесконечные списки
- •Ввод-вывод
- •Нетривиальные функции
- •Лабораторная работа 5 Простые числа и факторизация
- •Деревья
- •Деревья вычислений
- •Дополнительные задания для самостоятельной работы Задания с Project Euler
- •Простейший инструментарий Установка WinHugs и начало работы
- •Работа с интерпретатором WinHugs в интерактивном режиме
- •Команды интерпретатору
- •Работа с модулями
- •Список рекомендуемой литературы и электронных ресурсов
Простейший инструментарий Установка WinHugs и начало работы
Для обучения языку вполне достаточно будет простого интерпретатора языка Haskell, который называется Hugs. Последнюю версию лучше всего брать здесь:
http://cvs.haskell.org/Hugs/pages/downloading.htm
На момент написания этого текста, последняя версия, доступная по приведенной выше ссылке, называется WinHugs-Sep2006.exe. Установка типична и проблем не вызывает.
Вообще говоря, интерпретатор Hugs не поддерживается разработчиками уже несколько лет (по крайней мере, не выходят обновления). Достоинством его является маленький размер и простота использования, поэтому для обучения я рекомендую пользоваться именно им.
Тем же, кто хочет с самого начала работать со "взрослыми" пакетами разработки на языке Haskell, прямая дорога к The Haskell Platform с его GHC (Glasgow Haskell Compiler) и набором стандартных библиотек и утилит (в том числе и очень похожей на Hugs маленькой интерпретируемой средой WinGHCi). Взять все необходимое можно здесь:
http://www.haskell.org/platform/
Интересующихся более полным обзором имеющегося инструментария для разработки на языке Haskell, отсылаю к отдельной книге [3].
Работа с интерпретатором WinHugs в интерактивном режиме
Примечание: текст этого и нескольких следующих разделов в своей большей части представляет собой перевод частей документа "The Hugs 98 User Manual".
При запуске программа отображает главное окно программы с информацией о версии и приглашением к работе:
Type :? for help
Hugs>
Интерпретатор представляет собой диалоговую среду, в которой пользователь печатает предложение, а система это предложение вычисляет и выдает ответ.
Вообще говоря, Hugs – это что-то вроде очень сложного калькулятора. Интерпретатор просто вычисляет значение введенного пользователем выражения и возвращает результат этого вычисления:
Hugs> (2+3)*8
40
Hugs > sum [1..10]
55
Hugs >
Надпись Hugs> в начале первой, третьей и пятой строк – это приглашение к работе, отображаемое интерпретатором. Оно показывает, что система готова к вводу пользователем выражений. В первом случае пользователь ввел выражение (2+3)*8, которое было вычислено и результат 40 возвращен пользователю. В ответ на второе приглашение системы пользователь ввел выражение sum [1..10]. Запись [1..10] означает список целых чисел от 1 до 10, а sum – это функция из стандартных модулей, которая возвращает сумму чисел в заданном списке. Таким образом, интерпретатор возвращает:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 → 55
На самом деле, чтобы посчитать эту сумму, можно было прямо так и набрать в строке ввода:
Hugs > 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
55
Hugs >
Однако в отличие от калькуляторов, Hugs не ограничивается работой с числами. Выражения могут включать значения многих типов: числа, логические значения, символы, строки, списки, функции и другие типы, в том числе и определенные пользователем. Например:
Hugs > (not True) || False
False
Hugs > reverse "Hugs is cool"
"looc si sguH"
Hugs > filter even [1..10]
[2, 4, 6, 8, 10]
Hugs > take 10 fibs where fibs = 0:1:zipWith (+) fibs (tail fibs)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Hugs >
Однако в командной строке интерпретатора можно только вычислять значения выражений, но нельзя вводить новые определения: их нужно помещать в файлы и загружать (как это сделать, будет объяснено совсем скоро).
Определение fibs в последнем примере создается только при вычислении выражения и не сохраняется для последующего использования. К тому же выражение не может содержать переносов строк (хотя и может занимать больше, чем одну строку на экране).