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



Выражение v :: T означает, что значение v имеет тип T. Стрелка a -> b означает функцию, то есть из a мы

можем получить b. Итак, перед нами функция из Bool в Bool, под названием not. Мы можем предположить,

что это логическая операция “не”. Или, перед нами такое определение типа:

reverse :: [a] -> [a]

Мы видим функцию с именем reverse, которая принимает список [a] и возвращает список [a], и мы

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

идут в обратном порядке. Маленькая буква a в [a] является параметром типа, на место параметра может быть

поставлен любой тип. Она говорит о том, что список содержит элементы типа a. Например, такая функция

соглашается переворачивать только списки логических значений:

reverseBool :: [Bool] -> [Bool]

Программа представляет собой описание некоторого явления или процесса. Типы определяют основные

слова или термины и способы их комбинирования. А значения представляют собой комбинации базовых

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

задаются типами.

Например, такое выражение определяет тип, в котором два базовых термина True или False

data Bool = True | False

Слово data ключевое, с него начинается любое определение нового типа. Символ | означает или. Наш

новый тип Bool является либо словом True, либо словом False. В этом типе есть только понятия, но нет

способов комбинирования, посмотрим на тип, в котором есть и то, и другое:

data [a] = [] | a : [a]

Это определение списка. Как мы уже поняли, a – это параметр. Список [a] может быть либо пустым

списком [], либо комбинацией a : [a]. В этой комбинации знак : объединяет элемент типа a и ещё один

список [a]. Это рекурсивное определение, они встречаются в Haskell очень часто. Если это пока кажется

непонятным, не пугайтесь, в следующих главах будет представлено много примеров с пояснениями.

Приведём ещё несколько примеров определений; ниже типы определяют базовые понятия для мира ка-

лендаря: то что стоит за – является комментарием и игнорируется при выполнении программы:

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

-- Дата

data Date = Date Year Month Day

-- Год

data Year

= Year Int

-- Int это целые числа

-- Месяц

data Month

= January

| February

| March

| April

| May

| June

| July

| August

| September

| October

| November | December

data Day = Day Int

-- Неделя

data Week

= Monday

| Tuesday

| Wednesday

| Thursday

| Friday

| Saturday

| Sunday

-- Время

data Time = Time Hour Minute Second