Учебник по Haskell - [18]

Шрифт
Интервал

declaration for (Show Week)

In a stmt of an interactive GHCi command: System.IO. print it

Смотрите мы попытались распечатать значение Monday, но в ответ получили ошибку. В ней интерпре-

татор сообщает нам о том, что для типа Week не определён экземпляр класса Show, и он не знает как его

распечатывать. Давайте подскажем ему. Обычно дни недели в календарях печатают не полностью, в имя

попадают лишь три первых буквы:

instance Show Week where

show Monday

= ”Mon”

show Tuesday

= ”Tue”

show Wednesday

= ”Wed”

show Thursday

= ”Thu”

show Friday

= ”Fri”

show Saturday

= ”Sat”

show Sunday

= ”Sun”

Отступы перед show обязательны, но выравнивание по знаку равно не обязательно, мне просто нравится

так писать. По отступам компилятор понимает, что все определения относятся к определению instance.

Теперь запишем экземпляр в модуль, сохраним, и перезагрузим в интерпретатор:

*Calendar> :r

[1 of 1] Compiling Calendar

( Calendar. hs, interpreted )

Ok, modules loaded: Calendar.

*Calendar> Monday

Mon

it :: Week

*Calendar> Sunday

Sun

it :: Week

Теперь наши дни отображаются. Я выпишу ещё один пример экземпляра для Time, а остальные достанутся

вам в качестве упражнения.

30 | Глава 2: Первая программа

instance Show Time where

show (Time h m s) = show h ++ ”:” ++ show m ++ ”:” ++ show s

instance Show Hour where

show (Hour h) = addZero (show h)

instance Show Minute where

show (Minute m) = addZero (show m)

instance Show Second where

show (Second s) = addZero (show s)

addZero :: String -> String

addZero (a:[]) = ’0’ : a : []

addZero as

= as

Функцией addZero мы добавляем ноль в начало строки, в том случае, если число однозначное, также в

этом определении мы воспользовались тем, что для типа целых чисел Int экземпляр Show уже определён.

Проверим в интерпретаторе:

*Calendar> Time (Hour 13) (Minute 25) (Second 2)

13:25:02

it :: Time

2.5 Автоматический вывод экземпляров классов типов

Для некоторых стандартных классов экземпляры классов типов могут быть выведены автоматически.

Это делается с помощью директивы deriving. Она пишется сразу после объявления типа. Например так мы

можем определить тип и экземпляры для классов Show и Eq:

data T = A | B | C

deriving (Show, Eq)

Отступ за deriving обязателен, после ключевого слова в скобках указываются классы, которые мы хотим

вывести.

2.6 Арифметика

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

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

сравнения на больше/меньше, класс для умножения, класс для деления, класс для упорядоченных чисел, и

много других. Зачем такое изобилие классов?

Каждый из классов отвечает независимой группе операций. Есть много объектов, которые можно только

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

а сравнение на больше/меньше – нет.

Для иллюстрации мы воспользуемся числами Пеано, у них компактное определение, всего два конструк-

тора, которых тем не менее достаточно для описания множества натуральных чисел:

module Nat where

data Nat = Zero | Succ Nat

deriving (Show, Eq, Ord)

Конструктор Zero указывает на число ноль, а (Succ n) на число следующее за данным числом n. В

последней строчке мы видим новый класс Ord, этот класс содержит операции сравнения на больше/меньше:

Prelude> :i Ord

class (Eq a) => Ord a where

compare :: a -> a -> Ordering

(< ) :: a -> a -> Bool

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

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

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

max :: a -> a -> a

min :: a -> a -> a

Автоматический вывод экземпляров классов типов | 31

Тип Ordering кодирует результаты сравнения:

Prelude> :i Ordering

data Ordering = LT | EQ | GT

-- Defined in GHC.Ordering

Он содержит конструкторы, соответствующие таким понятиям как меньше, равно и больше.

Класс Eq. Сравнение на равенство

Вспомним определение класса Eq:

class Eq a where

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

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

a == b = not (a /= b)

a /= b = not (a == b)

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

мы видим определение == через /= и наоборот. Это определения методов по умолчанию. Такие определения

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

автоматически из определений по умолчанию.

Казалось бы почему не оставить в классе Eq один метод а другой метод определить в виде отдельной

функции:

class Eq a where

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

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

a /= b = not (a == b)

Так не делают по соображениям эффективности. Есть типы для которых проще вычислить /= чем ==.

Тогда мы определим тот метод, который нам проще вычислять и второй получим автоматически.

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

делением (minimal complete definition) класса. В случае класса Eq это метод == или метод /=.

Мы уже вывели экземпляр для Eq, поэтому мы можем пользоваться методами == и /= для значений типа

Nat:

*Calendar> :l Nat

[1 of 1] Compiling Nat

( Nat. hs, interpreted )

Ok, modules loaded: Nat.

*Nat> Zero == Succ (Succ Zero)

False

it :: Bool

*Nat> Zero /= Succ


Рекомендуем почитать
Уголовное право. Особенная часть

В книге кратко изложены ответы на основные вопросы темы «Уголовное право. Особенная часть». Издание поможет систематизировать знания, полученные на лекциях и семинарах, подготовиться к сдаче экзамена или зачета.Пособие адресовано студентам высших и средних образовательных учреждений, а также всем интересующимся данной тематикой.


Уголовно-исполнительное право

В книге кратко изложены ответы на основные вопросы темы «Уголовно-исполнительное право». Издание поможет систематизировать знания, полученные на лекциях и семинарах, подготовиться к сдаче экзамена или зачета.Пособие адресовано студентам высших и средних образовательных учреждений, а также всем интересующимся данной тематикой.


Самоучитель Adobe Premiere 6.5

Книга посвящена возможностям самого популярного средства цифрового видеомонтажа – Adobe Premiere 6.5. Описываются основные приемы работы с программой, приводятся сведения об управлении проектами и клипами, обсуждаются методы монтажа видео и звука, техника создания титров и добавления спецэффектов, а также освещается процесс окончательного монтирования фильма. На примерах рассматриваются все этапы создания и обработки фильмов для телевидения, видео и мультимедиа.Для широкого круга пользователей.


Финансовое право

В учебном пособии в краткой и доступной форме рассмотрены все основные вопросы, предусмотренные государственным образовательным стандартом и учебной программой по дисциплине «Финансовое право».Книга позволит быстро получить основные знания по предмету, а также качественно подготовиться к зачету и экзамену.Рекомендуется студентам, аспирантам и преподавателям по юридическим, экономическим и управленческим специальностям, а также сотрудникам банков.Автор книги, Шевчук Денис Александрович, имеет опыт преподавания различных дисциплин в ведущих ВУЗах Москвы (экономические, юридические, технические, гуманитарные), два высших образования (экономическое и юридическое), более 30 публикаций (статьи и книги), Член Союза Юристов Москвы, Член Союза Журналистов России, Член Союза Журналистов Москвы, Стипендиат Правительства РФ, опыт работы в банках, коммерческих и государственных структурах (в т.ч.


фгос  ответы

Содержащиеся в пособии контрольно-измерительные материалы (КИМы) для 5 класса, аналогичные материалам ЕГЭ, составлены в соответствии с программой общеобразовательных учреждений по русскому языку и учитывают возрастные особенности учащихся. В конце пособия даны ответы на все варианты тестов, предложены диктанты различных типов.Пособие адресовано учителям, ученикам, их родителям и всем, кому необходимо закрепить и систематизировать знания перед ЕГЭ.


Теория литературы. Чтение как творчество

Цель предлагаемого пособия – систематизировать и обогатить представления о природе, структуре и особенностях художественной литературы как вида искусства, помочь совершенствованию читательского мастерства. Книга снабжена кратким словарем основных литературоведческих понятий и терминов (составлен при участии доцента О.В. Быстровой).Для студентов филологических факультетов, учителей, преподавателей литературы высших и средних учебных заведений.