
ФиЛП_материалы / Материалы / Haskell / Интерфейс Haskell
.doc
Интерактивный интерпретатор для Glasgow Haskell Compiler (ghci). Инструкция пользователю.
У языка Haskell есть много реализаций, из которых широко используются две. Hugs — это интерпретатор, используемый, в основном, для обучения. Для реальных приложений намного более популярен Glasgow Haskell Compiler (GHC). По сравнению с Hugs, GHC намного более приспособлен для «настоящей работы»: он компилирует в машинный код, поддерживает параллельное выполнение и предоставляет полезные инструменты для анализа и отладки.
Интерактивный интерпретатор для GHC — это программа ghci. Она позволяет нам вводить и вычислять выражения на Haskell, исследовать модули и отлаживать наш код.
После установки в операционных системах семейства Windows GHCi доступен через меню «Пуск». При этом имеется два варианта интерактивного интерпретатора:
-
GHCi – консольный вариант интерпретатора
-
WinGHCi – тот же интерпретатор, но с оконным интерфейсом.
Именно о последнем далее пойдет речь.
Вот так выглядит основное окно WinGHCi:
В первой строке вы можете видеть приглашение к вводу (Prelude>). Оно может меняться в процесе работы, например, это можно сделать вручную, набрав команду
:set prompt "ghci> "
Приведем несколько примеров вычисления арифметических и логических операций:
И пример сообщения об ошибке:
GHCi говорит нам, что "ololo" не является числом, и он (GHCi) не знает, как это прибавить к 5. Дело в том, что «+» ожидает, что аргументы слева и справа будут числовыми. Если же мы попытаемся посчитать, например, «True == 5», GHCi скажет нам, что типы не совпадают.
Как вы уже, наверное, заметили, арифметические и логические действия в Haskell записываются инфиксно, в отличие от, например, Common LISP’a. Однако же, как и в LISP, они являются функциями.
Рассмотрим вызов префиксных функций.
В Haskell функции вызываются указанием имени функции, пробела и затем параметров, разделенных пробелами.
Как можно увидеть из последней строки примера, если мы хотим получить последующее значение от произведения чисел 4.5 и 2, мы не можем написать «succ 4.5 * 2», потому что это даст последующее значение за 4.5 (5.5), которое будет умножено на 2.
Вызов функции без параметров и последовательный (вложенный) вызов функции приведены на следующем рисунке:
Определение функций пользователя
Давайте теперь создадим собственную функцию. Откройте простой текстовый редактор, наподобие Блокнота или Notepad++, и наберите такую функцию, принимающую число и возводящую его в квадрат.
mySquaring x = x * x
Определяются функции точно так же, как и вызываются. Имя функции начинается с маленькой буквы. За именем функции следуют параметры, разделенные пробелами. Но при определении функции есть еще символ «=» и следом за ним описывается, что функция делает и возвращает. Сохраните это, например, под именем «Main.hs». Затем в WinGHCi используйте команду
:load <имя_файла>
или воспользуйтесь графическим интерфейсом:
Выберите
в меню File
пункт Load,
или используйте кнопку -
Вы увидите стандартный диалог открытия файла Windows:
При успешной загрузке файла, интерпретатор выведет примерно следующее сообщение:
Как видите, приглашение ко вводу изменилось. Теперь оно имеет вид имени загруженного модуля.
Теперь определенную в модуле функцию можно вызвать:
При загрузке модуля исходного кода в GHCi он, как правило, преобразуется в байт-код и запускается при помощи интерпретатора. Тем не менее, интерпретируемый код может работать вместе со скомпилированным, например, при запуске GHCi загружается скомпилированная копия базового пакета, который содержит Prelude.
Зачем это необходимо? Скомпилированный код примерно в 10 раз быстрее интерпретируемого, но требует в два раза большей производительности.
Так что, в больших проектах, стоит скомпилировать те части программы, которые меняются не очень часто, а с помощью интерпретатора разрабатывать остальные части проекта.
Редактирование
После загрузки модуля появляется возможность его редактирования прямо из среды программирования. Для этого в меню Action выберите пункт Open Text Editor
Или
воспользуйтесь кнопкой -
Откроется окно текстового редактора, используемого интерпретатором. Это сторонняя программа, которую можно поменять. В Windows по умолчанию для GHCi установлен в качестве редактора notepad.exe.
Точки останова и трассировка
Для иллюстрации работы данного механизма напишем немного более серьезную функцию, нежели использованная ранее. Например – рекурсивную функцию нахождения наибольшего общего делителя:
nod x y | (x == y) = x
| (x > y) = nod (x-y) y
| (x < y) = nod x (y-x)
Перезагрузим модуль “Main.hs”. И выполним следующую команду:
:break 2 – команда выполняет установку точки останова на второй строке нашего модуля, вот тут “| (x > y) = nod (x-y) y”.(Также команда :break может выполнить установку точки останова на имени определенной функции: “:break <name>”.)
На экране мы увидим примерно следующее:
Как видите, интерпретатор выводит значения локальных переменных, а также результата выражения, на котором произошла остановка. Чтобы продолжить работу после точки останова, используйте команду “:continue”, чтобы сделать один шаг после точки останова на следующую функцию используйте “:step” или “:step <expr>”, последнее позволяет перейти к конкретному выражению, расположенному после точки останова.
Так как наша функция рекурсивна, то использование команды “:continue” позволяет проследить значения локальных переменных на всех уровнях рекурсии:
На самом нижнем уровне рекурсивные вызовы останавливаются до точки останова, поэтому мы ничего не увидим.
Чтобы удалить назначенную точку останова, необходимо использовать команду “:delete <number>”, где <number> - номер точки останова (номер присваивается ей при назначении, см. выше).
Для трассировки используется комбинация команд “:trace” и “:history”. Первая используется после остановки программы на точке останова, вторая выводит историю выполнения:
Для дополнительной информации по отладке используйте команду “:help”.
Список использованной при написании инструкции литературы. Возможные источники информации по языку Haskell
-
Инструкция пользователю от разработчиков Haskell Platform (на английском языке): http://lambda.haskell.org/platform/doc/current/ghc-doc/users_guide/index.html
-
Учебник Haskell со своеобразным подходом и юмором, соответствует интерпретатору GHCi (на английском языке): http://learnyouahaskell.com/chapters
-
Начало перевода предыдущего источника на популярном ресурсе Хабрахабр: http://habrahabr.ru/post/72782/
-
Перевод учебника «Haskell для реального мира» (Первые две главы).
http://translated.by/you/real-world-haskell-chapter-1-getting-started/into-ru/
http://translated.by/you/real-world-haskell-chapter-2-types-and-functions/into-ru/
-
Ссылка на скачивание Haskell Platform под Windows на сайте разработчика: http://hackage.haskell.org/platform/windows.html (около 90 Мб)