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

Команды интерпретатору

Каждая вводимая пользователем строка расценивается Hugs как команда интерпретатору. Если вводимая строка представляет из себя выражение, то, как было показано раньше, она рассматривается как команда интерпретатору вычислить значение этого выражения и вернуть его пользователю. Кроме выражений пользователь может использовать набор заранее определенных команд, самой главной из которых является ":?".

При вводе такой команды Hugs вернет список команд, которые могут быть использованы, все они начинаются с двоеточия.

Некоторые команды приведены ниже. Самой важной и полезной командой здесь является команда ":t", возвращающая тип функции.

:l <filenames> загрузить модули из файлов

:r перезагрузить текущий модуль

:e <filename> редактировать модуль

:e редактировать текущий модуль

<expr> вычислить значение выражения

:t <expr> вывести тип выражения

:? вывести список доступных команд

:n [pat] вывести функции с именем,

подходящим под шаблон [pat]

:q выйти из интерпретатора

Работа с модулями

Функции типа sum, (+), take и прочие, использованные в приведенных выше примерах являются стандартными и определены в стандартных модулях. В этом загружаемом по умолчанию модуле определено огромное количество полезных функций; но, разумеется, чтобы сделать что-то полезное, необходимо уметь создавать свои собственные функции. Лучше всего при этом создавать их в собственном модуле (или модулях) и загружать в Hugs. Модуль – это всего-лишь набор определений, хранимых в каком-то файле. Разумеется, в каждом модуле может храниться множество определений функций.

Например, создадим следующий модуль и сохраним его в файле fact.hs. (Модули Hugs обычно имеют расширение ".hs", а имя модуля должно совпадать с именем файла и начинаться с прописного символа.

module Fact where

fact :: Integer -> Integer

fact n = product [1..n]

Функция product, использованная здесь, является стандартной и определена в стандартном модуле; она используется для вычисления произведения всех числен из списка, так же как функция sum используется для вычисления суммы списка чисел.

Таким образом, приведенные выше строки определяют функцию, которая берет число, обозначаемое n и вычисляет его факториал. В стандартной математической записи fact n = n! определяется следующим образом:

n! = 1 * 2 * ... * (n-1) * n

Когда вы привыкнете к используемой Hugs нотации, то заметите, что определения функций в Hugs очень часто близки к неформальным математическим определениям. Еще одно часто используемое математическое определение факториала выглядит следующим образом:

f(0) = 1

f(n) = n * f(n-1)

Совершенно аналогичным образом можно было определить функцию в Hugs. Для этого добавим три строчки в конец определенного ранее модуля Fact:

f :: Integer -> Integer

f 0 = 1

f n = n * f (n-1)

Для того, чтобы можно было использовать введенные определения в среде интерпретатора, модуль необходимо загрузить. Для этого используется команда :load (или :l , потому что все команды можно сокращать до первой буквы):

Hugs> :l fact.hs

Fact>

То же самое можно было выполнить с помощью кнопки в командном окне интерпретатора, если файл находится не в каталоге программы. Заметьте, что к модулю Hugs, используемому интерпретатором, теперь добавился файл Fact.hs. Приглашение к работе теперь тоже изменилось, и оно говорит о том, что теперь мы можем использовать определенные в модуле функции:

Fact> fact 6

720

Fact> fact 6 + fact 7

5760

Fact> fact 7 `div` fact 6

7

Fact>

В одном модуле можно подключить функциональность из другого модуля. Для этого нужно написать в модуле, например:

import Char

Теперь, после того, как весь основной инструментарий готов, пора приступать к изучению собственно теории и практики функционального программирования на языке Haskell.