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

Может показаться, что с типом Bool мы зациклены на двух конструкторах, и единственное, что нам оста-

ётся – это давать всё новые и новые имена словам True и False. Но на самом деле это не так. С помощью

типов-параметров мы можем выйти за эти рамки. Определим функцию ветвления ifThenElse:

ifThenElse :: Bool -> a -> a -> a

ifThenElse True

t

_ = t

ifThenElse False

_

e = e

Эта функция первым аргументом принимает значение типа Bool, а вторым и третьим – альтернативы

некоторого типа a. Если первый аргумент – True, возвращается второй аргумент, а если – False, то третий.

Интересно, что в Haskell ничего не происходит, мир Haskell-значений стоит на месте. Мы просто даём

имена разным комбинациям слов. Определяем новые термины. Потом на этих терминах определяем новые

термины, и так далее. Кажется, если ничего не меняется, то зачем язык? И что мы собираемся программиро-

вать без вычислений?

Значения | 17

Разгадка кроется в функциях not, and и or. До того как мы их определили, у нас было четыре имени, но

после их определения имён стало бесконечное множество. Три синонима пополнили наш язык бесконечным

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

мы просим ”вычислить’ комбинацию из них. Мы не определяли явно, чему равна комбинация not (and true

False), это сделал за нас вычислитель Haskell1.

Вычислить стоит в кавычках, потому что на самом деле вычислений нет, есть замена синонимов на ком-

бинации простейших элементов.

Ещё один пример, положим у нас есть тип:

data Status = Work | Rest

Он определяет, что делать в данный день: работать (Work) или отдыхать (Rest). У разных рабочих разный

график. Например, есть функции:

jonny :: Week -> Status

jonny x = ...

colin :: Week -> Status

colin x = ...

Конкретное определение сейчас не важно, важно, что они определяют зависимость статуса (Status) от

дня недели (Week) для работников Джонни (jonny) и Колина (colin).

Также у нас есть полезная функция:

calendar :: Date -> Week

calendar x = ...

Она определяет по дате день недели. И теперь, зная лишь эти функции, мы можем спросить у вычислителя

будет ли у Джонни выходной 8 августа 3043 года:

jonny (calendar (Date (Year 3043) August (Day 8)))

=> jonny Saturday

=> Rest

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

смогли получить полезную нам информацию, ничего не вычисляя.

1.4 Классы типов

Если типы и значения – привычные понятия, которые можно найти в том или ином виде в любом языке

программирования, то термин класс типов встречается не часто. У него нет аналогов и в обычном языке,

поэтому я сначала постараюсь объяснить его смысл на примере.

В типизированном языке у каждой функции есть тип, но бывают функции, которые могут быть опреде-

лены на аргументах разных типов; по сути, они описывают схожие понятия, но определены для значений

разных типов. Например, функция сравнения на равенство, говорящая о том, что два значения одного типа

a равны, имеет тип a -> a -> Bool, или функция печати выражения имеет тип a -> String, но что такое

a в этих типах? Тип a является любым типом, для которого сравнение на равенство или печать (преобразо-

вание в строку) имеют смысл. Это понятие как раз и кодируется в классах типов. Классы типов (type class)

позволяют определять функции с одинаковым именем для разных типов.

У классов типов есть имена. Также как и имена классов, они начинаются с большой буквы. Например,

класс сравнений на равенство называется Eq (от англ. equals – равняется), а класс печати выражений имеет

имя Show (от англ. show – показывать). Посмотрим на их определения:

Класс Eq:

class Eq a where

(==) :: a -> a -> Bool

(/=) :: a -> a -> Bool

Класс Show:

1Было бы точнее называть вычислитель редуктором, поскольку мы проводим редукции, или замену эквивалентных значений, но

закрепилось это название. К тому же, редуктор также обозначает прибор.

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

class Show a where

show :: a -> String

За ключевым словом class следует имя класса, тип-параметр и ещё одно ключевое слово where. Далее с

отступами пишутся имена определённых в классе значений. Значения класса называются методами.

Мы определяем лишь типы методов, конкретная реализация будет зависеть от типа a. Методы определя-

ются в экземплярах классов типов, мы скоро к ним перейдём.

Программистская аналогия класса типов это интерфейс. В интерфейсе определён набор значений (как

констант, так и функций), которые могут быть применены ко всем типам, которые поддерживают данный

интерфейс. К примеру, в интерфейсе “сравнение на равенство” для некоторого типа a определены две функ-

ции: равно (==) и не равно (/=) с одинаковым типом a -> a -> Bool, или в интерфейсе “печати” для любого

типа a определена одна функция show типа a -> String.

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

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

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

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

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

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

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

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

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