52700.fb2
data Hour
= Hour
Int
-- Час
data Minute = Minute Int
-- Минута
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