Главная » Haskell » Технология сопоставления с образцами

0

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

«переменная». Это даже  не синоним словосочетания «формальный  параметр», как это могло показаться после изучения приводимых до этого момента определений функций. Образцы являются частью  технологии сопоставления с образцами, которая используется для выполнения вычислительных  процессов внутри функций в части  означивания формальных параметров и сравнения фактических величин (значений) с определёнными шаблонами.

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

Особо следует рассмотреть образец (_). Этот образец облегчает работу транслятора языка Haskell, указывая ему, что фактическое значение использоваться не будет, а потому это значение просто не вычисляется в силу ленивости вычислительной модели языка. Более того, таких образцов в одном клозе может быть несколько, чего нельзя сказать о прочих переменных образцов. Любое имя переменной, которое  используется в образцах, может быть  задействовано только один раз во всём наборе образцов одного клоза. Нельзя написать что-то вроде:

someFunction  x  x  = x  + x

Такая запись вызовет сообщение о синтаксической ошибке: «повторяющийся идентификатор переменной в образцах». Но маску  подстановки (_) можно использовать неограниченное количество раз.

Но ещё раз необходимо подчеркнуть, что образцы не являются наименованием фактических параметров функции (более того, они используются не только в определениях функций, но и во многих других местах). В двух соседних клозах одной функции для обозначения одного и того же формального параметра можно использовать совершенно разные образцы. Здесь играет роль способ сопоставления, а не наименование формального параметра. И  именно на это необходимо обращать внимание программисту.

Где же  используются образцы? В языке  Haskell имеется  несколько мест их использования, которые резонно перечислить:

1)                        В клозах определений функций. Это обычный способ  использования  образцов, в котором механизм сопоставления с образцами работает наиболее ярким образом, если так можно выразиться.

2)                        В определениях альтернатив  оператора case. Каждая альтернатива этого оператора оформляется  образцом. Обычно  это константные  образцы, но могут быть и вполне  себе переменные.

3)                        В определениях анонимных функций. Здесь способ использования образцов абсолютно такой же, как и при определении обычных функций.

4)                        В последовательностях действий, оформленных оператором do. В этом случае образец стоит слева от операции (<-),  и этот  образец просто заменяет соответствующий  образец в  анонимной функции, которая  скрывается при помощи удобного синтаксиса.

Остаётся рассмотреть некоторые специальные виды образцов,  которым  посвящены подразделы ниже.

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

По теме:

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