Охрана (программирование)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Охра́на (охраня́ющее выраже́ние, охранное выражение) — логическое выражение, которое предназначено для ограничения вычислительных процессов и выбора варианта вычислений. Обычно, используется в функциональных языках программирования (например, Haskell, Erlang)[1].

Примеры охраняющих выражений

[править | править код]

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

Функция divisors возвращает список делителей заданного числа n. Во второй строке определения показана охрана, которая ограничивает выбор элемента списка делителей x только таким значением, которое делит исходный параметр n без остатка.

divisors n = [x | x <- [1..(n - 1)],
                  n `mod` x == 0]

Пример 2 — Охрана в теле функции

[править | править код]

Функция sign возвращает знак заданного числа x. Охраняющие выражения записаны после символов (|). Они позволяют выбрать ту или иную альтернативу при вычислении знака числа. Такой способ охранения часто используется вместо механизма сопоставления с образцом, когда в функции нет возможности явно описать образец (например, в случае, если функция является обобщённой прикладной функцией для обработки значений некоторого типа, являющегося экземпляром какого-либо класса).

sign x | x < 0  = -1
       | x == 0 = 0
       | x > 0  = 1

Оформление в виде охраны позволяет в случае недопустимого выражения для сопоставления перейти к следующему. В случае, если предыдущий пример будет оформлен как оператор сопоставления с образцом, то при x = 0 первое сопоставление (x < 0) вызовет ошибку, обработчик которой прекратит дальнейшие попытки на сопоставление. Кроме того, для случая неистинности всех выражений, удобно отлавливать такие ситуации установкой непосредственного значения истинности True. Для удобочитаемости, в стандартной библиотеке Prelude имеется константа otherwise, что внешне ещё более напоминает переключатель в алгоритмических языках.

Примечания

[править | править код]

Литература

[править | править код]
  • Душкин Р.В. Охрана // Приёмы программирования // Функции // Синтаксис и идиомы языка // Справочник по языку Haskell / Гл. ред. Д. А. Мовчан. — М.: ДМК Пресс, 2008. — С. 37-38. — 554 с. — 1500 экз. — ISBN 5-94074-410-9.
  • Чезарини Ф., Томпсон С. Программирование в Erlang = Erlang Programming. — М.: «ДМК Пресс», 2012. — С. 76-78. — 488 с. — ISBN 978-5-94074-617-1.