Учебник по Haskell | страница 21
-- Время
data Time = Time Hour Minute Second
data Hour
= Hour
Int
-- Час
data Minute = Minute Int
-- Минута
data Second = Second Int
-- Секунда
Одной из основных целей разработчиков Haskell была ясность. Они стремились создать язык, предложе-
ния которого будут простыми и понятными, близкий к языку спецификаций.
С символом | мы уже познакомились, он указывает на альтернативы, объединение пишется через пробел.
Так, фраза
data Time = Time Hour Minute Second
означает, что тип Time – это значение с меткой Time, которое состоит из значений типов “час”, “время” и
“секунда”, и больше ничего. Метку принято называть конструктором.
Фраза
data Year = Year Int
означает, что тип Year – это значение с конструктором Year, которое состоит из одного значения типа
Int. Конструктор обычно идёт первым, а за ним через пробел следуют другие типы. Конструктор может быть
и самостоятельным значением, как в случае True или January.
Типы делят выполнение программы на две стадии: компиляцию (compile-time) и вычисление (run-time). На
этапе компиляции происходит проверка типов. Программа, которая не прошла проверку типов, считается
бессмысленной и не вычисляется. Приложение, которое выполняет компиляцию, называют компилятором
(compiler), а то приложение, которое проводит вычисление, называют вычислителем (run-time system).
Типами мы определяем основные понятия в том явлении, которое мы хотим описать, а также осмыслен-
ные способы их комбинирования. Мы говорим, как из простейших терминов получаются составные. Если мы
попытаемся построить бессмысленное предложение, компилятор языка автоматически найдёт такое предло-
жение и сообщит нам об этом. Этот процесс заключается в проверке типов, к примеру если у нас есть функция
сложения чисел, и мы попытаемся передать в неё строку или список, компилятор заметит это и скажет нам
об этом перед тем как программа начнёт выполнятся. И важно то, что это произойдёт очень быстро. Если мы
случайно ошиблись в выражении, которое будет вычислено через час, нам не нужно ждать пока вычислитель
дойдёт до ошибки, мы узнаем об этом, не успев моргнуть, после запуска программы.
Итак, если мы попробуем составить время из месяцев и логических значений:
Time January True 23
компилятор предупредит нас об ошибке. Наверное, вы думаете, что приведенный пример надуман, ведь
кому захочется составлять время из логических значений? Но когда вы пишете программу, часто процесс
работы складывается так: вы думаете над одним, пишете другое, а также планируете вернуться к третьему.