Учебник по Haskell | страница 22



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

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

Отметим, что такой подход с разделением вычисления на две стадии и проверкой типов называется

статической типизацией. Есть и другие языки, в них типы лишь подразумеваются и программа сразу начинает

Типы | 15

вычисляться, если есть какие-то несоответствия, об ошибке программисту сообщит вычислитель, причём

только тогда, когда вычисление дойдёт до ошибки. Такой подход называют динамической типизацией.

Типы требуют серьёзных размышлений на начальном этапе, этапе определения базовых терминов и спо-

собов их комбинирования. Не упускаем ли мы что-то важное из виду, или, может быть, типы имеют слишком

общий характер и допускают ненужные нам предложения? Приходится задумываться. Но если типы подо-

браны удачно, они сами начинают подсказывать, как строить программу.

1.3 Значения

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

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

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

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

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. Опять же, мы ничего не вычисляем, мы даём

новые имена нашим константам