русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Охрана и локальные переменные

Как было показано в третьей лекции, охрана и локальные переменные используются в фун­к­циональном программировании исключительно для простоты записи и понимания тек­стов программ. Haskell не обошёл своим вниманием и этот аспект, в его синтаксисе име­ются специальные средства, которые позволяют организовывать охрану и ис­поль­зо­вать локальные переменные.

Если возникла необходимость определить какую-либо функцию с использованием ме­ха­низма охраны, то для этой цели необходимо использовать символ вертикальной черты " | " :

sign x | x > 0 = 1

| x == 0 = 0

| x < 0 = -1

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

Для того чтобы облегчить написание программ, сделать их более читабельными и прос­тыми для понимания в том случае, когда в каком-либо определении функции за­пи­са­но большое количество клозов, в Haskell’е существует ключевое слово "case". При по­мо­щи этого слова можно не записывать клозы определения функций так, как это принято в "чистом" функциональном программировании, а несколько сократить запись. Вот общий вид определения функций с ключевым словом "case":

Function X1 X2 ... Xk = case (X1, X2, ..., Xk) of

(P11, P21, ..., Pk1) ® Expression1

...

(P1n, P2n, ..., Pkn) ® Expressionn

В приведенном выше описании жирным шрифтом выделены служебные слова и сим­во­лы языка.

Так функция, которая возвращает список из первых n элементов заданного списка, мо­жет быть определена следующим образом при помощи служебного слова "case":

takeFirst n l = case (n, l) of

(0, _) -> []

(_, []) -> []

(n, (x:xs)) -> (x) : (takeFirst (n – 1) xs)

И такая запись будет полностью эквивалентна обычному определению функции:

takeFirst 0 _ = []

takeFirst _ [] = []

takeFirst n (x:xs) = (x) : (takeFirst (n – 1) xs)

Пришло время объяснить понятие маски подстановки. В Haskell’е маску обозначают сим­волом нижней черты " _ " (абсолютно так же, как и в Prolog’е). Этот символ заменяет лю­бой образец и является своего рода анонимной переменной. Если в выражении клоза нет необходимости использования переменной образца, то её можно заменить маской под­с­тановки. При этом, естественно, происходят отложенные вычисления — то выражение, ко­торое может быть подставлено вместо маски, не вычисляется.

Другим способом использования охраняющих конструкций является использование кон­струкции "if-then-else". В Haskell’е реализована и эта возможность. Формально, эта кон­струкция может быть легко трансформирована в выражение с использованием слу­жеб­но­го слова "case". Можно даже считать, что выражение:

if Exp1 then Exp2 else Exp3

Является сокращением выражения:

case (Exp1) of

(True) -> Exp2

(False) -> Exp3

Естественно, что тип Exp1 должен быть Bool, а типы выражений Exp2 и Exp3 совпадать (ведь именно значения этих выражений будет возвращено оп­ре­де­ля­емой через конструкцию "if-then-else" функцией).

Для использования локальных переменных (в смысле функциональной парадигмы прог­раммирования) в Haskell’е существует два типа записи. Первый тип полностью со­от­вет­ствует математической нотации, введенной в третьей лекции:

let y = a * b

f x = (x + y) / y

in f c + f d

Другим способом определения локальной переменной является её описание после ис­поль­зования. В этом случае используется служебное слово "where", которое ставится в кон­це выражения:

f x y | y > z = y – z

| y == z = 0

| y < z = z – y

where z = x * x

Видно, что Haskell поддерживает два способа записи определения ло­каль­ных переменных — префиксный (при помощи служебного слова "let") и пос­т­фик­с­ный (при помощи служебного слова "where"). Оба способа являются равнозначными, их упот­ребление зависит только от наклонностей программиста. Однако обычно пос­т­фик­с­ный способ записи используется в выражениях, где также есть охрана, в то время как пре­фик­сный способ записи используется в остальных случаях.

Просмотров: 518


Вернуться в оглавление



Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.