Главная » Haskell » Синтаксис и идиомы языка

0

Функции

Функции являются базовым программным  элементом в языке Haskell, при помощи которого строятся программы. Сложно (но можно) построить программу на этом языке, в которой не было бы определений функций. При помощи функций определяются  вычислительные  процессы, которые  являются сутью создаваемой программы. Поэтому изучение способов определения функций является важнейшим делом в постижении языка Haskell.

1.1.    Общий вид определения функций

С точки зрения функционального программирования и языка Haskell функция является программной сущностью верхнего уровня, при этом программа может состоять только из набора этих сущностей. Остальные программные сущности языка Haskell (типы данных, классы и их экземпляры, модули) могут присутствовать, а могут и отсутствовать в программах, но функции присутствуют всегда. Поэтому  определение функций является главным при программировании на языке Haskell.

Как  уже сказано, каждое определение функции является декларацией верхнего уровня. В определение может входить  необязательная сигнатура, то есть описание типа функции, а также  собственно описание того, что функция возвращает на основании входных параметров. Тем самым функция в языке Haskell является  отражением математического понятия «функция», которое  определе-

но как некоторая взаимосвязь между входными параметрами  (аргументами) и выходным значением (результатом).

Любые вычислительные процессы в языке Haskell описываются при помощи функций. Такое описание происходит в виде вызовов других  функций или самой себя, ветвления  в зависимости от какого-либо значения, либо определения локальных функций, чья зона видимости ограничивается описываемым вычислительным процессом. В качестве примера определения функции можно привести следующую запись:

repeat   ::  a  ->  [a] repeat   x  =  xs

where

xs  = x:xs

Это определение функции repeat  из стандартного модуля Prelude, которая строит бесконечный список из переданного ей на вход  значения  (подробно эта функция описана на стр. 158). Список состоит из элементов, каждый из которых равен входному значению. В связи с  тем,  что язык Haskell является ленивым, в нём вполне возможны такие объекты, как бесконечные списки.

Данное определение читается достаточно просто. Первая строка как раз является сигнатурой, которая описывает тип функции (подробное описание типов функций приводится в разделе 2.5.). Запись в этом примере обозначает, что функция repeat получает на вход ровно один аргумент некоторого типа a, а возвращает значение типа [a], то есть список значений типа a. Вторая строка определяет способ вычисления результата, возвращаемого функцией. Здесь используется локальное определение («замыкание») xs, которое описывается ниже после ключевого слова where. Само замыкание xs равно входному параметру x, который при помощи конструктора списков (:) добавляется к тому же xs. То есть здесь используется  рекурсия, которая никогда не остановится, чем и достигается  бесконечность получаемого результата.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии