Учебник по Haskell | страница 36
data Second = Second Int
-- Секунда
Теперь сохраним наш модуль под именем Calendar. hs и загрузим в интерпретатор:
Prelude> :l Calendar
[1 of 1] Compiling Calendar
( Calendar. hs, interpreted )
Ok, modules loaded: Calendar.
*Calendar> Monday
< interactive>:3:1:
No instance for (Show Week)
arising from a use of ‘System.IO. print’
Possible fix: add an instance 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. Она пишется сразу после объявления типа. Например так мы
можем определить тип и экземпляры для классов