Читаем Учебник по Haskell полностью

слов. Например в логических выражениях всего лишь два слова. Можем ли мы на что либо рассчитывать с

таким словарным запасом? Оказывается, что да. Здесь на помощь приходят синонимы. Сейчас у нас в активе

лишь два слова:

data Bool = True | False

И мы можем определить два синонима:

true :: Bool

true = True

false :: Bool

false = False

В Haskell синонимы пишутся с маленькой буквы. Синоним определяется через знак =. Обратите внимание

на то, что это не процесс вычисления значения. Мы всего лишь объявляем новое имя для комбинации слов.

Теперь мы имеем целых четыре слова! Тем не менее, ушли мы не далеко, и два новых слова, в сущности,

не делают язык выразительнее. Такие синонимы называют константами. Это значит, что одним словом мы

будем обозначать некоторую комбинацию других слов. В данном случае комбинации очень простые.

Но наши синонимы могут определять одни слова через другие. Синонимы могут принимать параметры.

Параметры пишутся через пробел между новым именем и знаком равно:

not :: Bool -> Bool

not True

= False

not False = True

Мы определили новое имя not с типом Bool -> Bool. Оно определяется двумя уравнениями (clause). Слева

от знака равно левая часть уравнения, а справа – правая. В первом уравнении мы говорим, что сочетание (not

True) означает False, а сочетание (not False) означает True. Опять же, мы ничего не вычисляем, мы даём

новые имена нашим константам True и False. Только в этом случае имена составные.

Если вычислителю нужно узнать, что кроется за составным именем not False он последовательно про-

анализирует уравнения сверху вниз, до тех пор, пока левая часть уравнения не совпадёт со значением not

False. Сначала мы сверим с первым:

not True

== not False

-- нет, пошли дальше

not False

== not False

-- эврика, вернём правую часть

=> True

Определим ещё два составных имени

and :: Bool -> Bool -> Bool

and False

_

= False

and True

x

= x

or

:: Bool -> Bool -> Bool

or True

_ = True

or False

x = x

Эти синонимы определяют логические операции “и” и “или”. Здесь несколько новых конструкций, но вы

не пугайтесь, они не так трудны для понимания. Начнём с _:

and False

_

= False

16 | Глава 1: Основы

Здесь cимвол _ означает, что в этом уравнении, если первый параметр равен False, то второй нам уже не

важен, мы знаем ответ. Так, если в логическом “и” один из аргументов равен False, то всё выражение равно

False. Так же и в случае с or.

Теперь другая новая конструкция:

and True

x

= x

В этом случае параметр x служит для того, чтобы перетащить значение из аргумента в результат. Кон-

кретное значение нам также не важно, но в этом случае мы полагаем, что слева и справа от =, x имеет одно

и то же значение.

Итак у нас уже целых семь имён: True, False, true, false, not, and, or. Или не семь? На самом деле, их

уже бесконечное множество. Поскольку три из них составные, мы можем создавать самые разнообразные

комбинации:

not (and true False)

or (and true true) (or False False)

not (not true)

not (or (or True True) (or False (not True)))

...

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

not true вместо not (not true), мы бы получили ошибку компиляции, потому что not ожидает один пара-

метр, а в выражении not not true их два. Параметры дописываются к имени через пробел.

Посмотрим, как происходят вычисления. В сущности, процесса вычислений нет, есть процесс замены

синонимов на основные понятия согласно уравнениям. Базовые понятия мы определили в типах. Так давайте

“вычислим” выражение not (and true False):

-- выражение

--

уравнение

not (and true False)

--

true

= True

not (and True False)

--

and True

x = x

=> and True False = False

not False

--

not False

= True

True

Слева в столбик написаны шаги “вычисления”, а справа уравнения, по которым синонимы заменяются

на комбинации слов. Процесс замены синонима (левой части уравнения) на комбинацию слов (правую часть

уравнения) называется редукцией (reduction).

Сначала мы заменили синоним true на правую часть его уравнения, тo есть на конструктор True. Затем

мы заменили выражение (and True False) на правую часть из уравнения для синонима and. Обратите вни-

мание на то, что переменная x была заменена на значение False. Последним шагом была замена синонима

not. В конце концов мы пришли к базовому понятию, а именно – к одному из двух конструкторов. В данном

случае True.

Интересно, что новые синонимы могут быть использованы в правых частях уравнений. Так мы можем

определить операцию “исключающее или”:

xor :: Bool -> Bool -> Bool

xor a b = or (and (not a) b) (and a (not b))

Этим выражением мы говорим, что xor a b это или отрицание a и b, или a и отрицание b. Это и есть

определение “исключающего или”.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных