Учебник по Haskell - [13]
имя Show (от англ. show – показывать). Посмотрим на их определения:
Класс Eq:
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
Класс Show:
1Было бы точнее называть вычислитель редуктором, поскольку мы проводим редукции, или замену эквивалентных значений, но
закрепилось это название. К тому же, редуктор также обозначает прибор.
18 | Глава 1: Основы
class Show a where
show :: a -> String
За ключевым словом class следует имя класса, тип-параметр и ещё одно ключевое слово where. Далее с
отступами пишутся имена определённых в классе значений. Значения класса называются методами.
Мы определяем лишь типы методов, конкретная реализация будет зависеть от типа a. Методы определя-
ются в экземплярах классов типов, мы скоро к ним перейдём.
Программистская аналогия класса типов это интерфейс. В интерфейсе определён набор значений (как
констант, так и функций), которые могут быть применены ко всем типам, которые поддерживают данный
интерфейс. К примеру, в интерфейсе “сравнение на равенство” для некоторого типа a определены две функ-
ции: равно (==) и не равно (/=) с одинаковым типом a -> a -> Bool, или в интерфейсе “печати” для любого
типа a определена одна функция show типа a -> String.
Математическая аналогия класса типов это алгебраическая система. Алгебра изучает свойства объекта в
терминах операций, определённых на нём, и взаимных ограничениях этих операций. Алгебраическая систе-
ма представляет собой набор операций и свойств этих операций. Этот подход позволяет абстрагироваться
от конкретного представления объектов. Например группа – это все объекты данного типа a, для которых
определены значения: константа – единица типа a, бинарная операция типа a -> a -> a и операция взятия
обратного элемента, типа a -> a. При этом на операции накладываются ограничения, называемые свойства-
ми операций. Например, ассоциативность бинарной операции, или тот факт, что единица с любым другим
элементом, применённые к бинарной операции, дают на выходе исходный элемент.
Давайте определим класс для группы:
class Group a where
e
:: a
(+) :: a -> a -> a
inv :: a -> a
Класс с именем Group имеет для некоторого типа a три метода: константу e :: a, операцию (+) :: a ->
a -> a и операцию взятия обратного элемента inv :: a -> a.
Как и в алгебре, в Haskell классы типов позволяют описывать сущности в терминах определённых на них
операций или значений. В примерах мы указываем лишь наличие операций и их типы, так же и в классах
типов. Класс типов содержит набор имён его значений с информацией о типах значений.
Определив класс Group, мы можем начать строить различные выражения, которые будут потом интер-
претироваться специфическим для типа образом:
twice :: Group a => a -> a
twice a = a + a
isE :: (Group a, Eq a) => a -> Bool
isE x = (x == e)
Обратите внимание на запись Group a => и (Group a, Eq a) => . Это называется контекстом объявления
типа. В контексте мы говорим, что данный тип должен быть из класса Group или из классов Group и Eq. Это
значит, что для этого типа мы можем пользоваться методами из этих классов.
В первой функции twice мы воспользовались методом (+) из класса Group, поэтому функция имеет кон-
текст Group a => . А во второй функции isE мы воспользовались методом e из класса Group и методом (==)
из класса Eq, поэтому функция имеет контекст (Group a, Eq a) => .
Контекст классов типов. Суперклассы
Класс типов также может содержать контекст. Он указывается между словом class и именем класса.
Например
class IsPerson a
class IsPerson a => HasName a where
name :: a -> String
Это определение говорит о том, что мы можем сделать экземпляр класса HasName только для тех типов,
которые содержатся в IsPerson. Мы говорим, что класс HasName содержится в IsPerson. В этом случае класс
из контекста IsPerson называют суперклассом для данного класса HasName.
Это сказывается на контексте объявления типа. Теперь, если мы пишем
Классы типов | 19
fun :: HasName a => a -> a
Это означает, что мы можем пользоваться для значений типа a как методами из класса HasName, так и
методами из класса IsPerson. Поскольку если тип принадлежит классу HasName, то он также принадлежит и
IsPerson.
Запись (IsPerson a => HasName a) немного обманывает, было бы точнее писать IsPerson a <= HasName
a, если тип a в классе HasName, то он точно в классе IsPerson, но в Haskell закрепилась другая запись.
1.5 Экземпляры классов типов
В экземплярах (instance) классов типов мы даём конкретное наполнение для методов класса типов. Опре-
деление экземпляра пишется так же, как и определение класса типа, но вместо class мы пишем instance,
вместо некоторого типа наш конкретный тип, а вместо типов методов – уравнения для них.
Определим экземпляры для Bool
Класс Eq:
instance Eq Bool where
(==) True
True
= True
(==) False False = True
(==) _
_
= False
(/=) a b
= not (a == b)
Класс Show:
instance Show Bool where
show True
= ”True”
show False = ”False”
Класс Group:
instance Group Bool where
e
= True
(+) a b = and a b
inv a
= not a
Отметим важность наличия свойств (ограничений) у значений, определённых в классе типов. Так, на-
пример, в классе типов “сравнение на равенство” для любых двух значений данного типа одна из операций
В книге кратко изложены ответы на основные вопросы темы «Уголовное право. Особенная часть». Издание поможет систематизировать знания, полученные на лекциях и семинарах, подготовиться к сдаче экзамена или зачета.Пособие адресовано студентам высших и средних образовательных учреждений, а также всем интересующимся данной тематикой.
В книге кратко изложены ответы на основные вопросы темы «Уголовно-исполнительное право». Издание поможет систематизировать знания, полученные на лекциях и семинарах, подготовиться к сдаче экзамена или зачета.Пособие адресовано студентам высших и средних образовательных учреждений, а также всем интересующимся данной тематикой.
Книга посвящена возможностям самого популярного средства цифрового видеомонтажа – Adobe Premiere 6.5. Описываются основные приемы работы с программой, приводятся сведения об управлении проектами и клипами, обсуждаются методы монтажа видео и звука, техника создания титров и добавления спецэффектов, а также освещается процесс окончательного монтирования фильма. На примерах рассматриваются все этапы создания и обработки фильмов для телевидения, видео и мультимедиа.Для широкого круга пользователей.
В учебном пособии в краткой и доступной форме рассмотрены все основные вопросы, предусмотренные государственным образовательным стандартом и учебной программой по дисциплине «Финансовое право».Книга позволит быстро получить основные знания по предмету, а также качественно подготовиться к зачету и экзамену.Рекомендуется студентам, аспирантам и преподавателям по юридическим, экономическим и управленческим специальностям, а также сотрудникам банков.Автор книги, Шевчук Денис Александрович, имеет опыт преподавания различных дисциплин в ведущих ВУЗах Москвы (экономические, юридические, технические, гуманитарные), два высших образования (экономическое и юридическое), более 30 публикаций (статьи и книги), Член Союза Юристов Москвы, Член Союза Журналистов России, Член Союза Журналистов Москвы, Стипендиат Правительства РФ, опыт работы в банках, коммерческих и государственных структурах (в т.ч.
Содержащиеся в пособии контрольно-измерительные материалы (КИМы) для 5 класса, аналогичные материалам ЕГЭ, составлены в соответствии с программой общеобразовательных учреждений по русскому языку и учитывают возрастные особенности учащихся. В конце пособия даны ответы на все варианты тестов, предложены диктанты различных типов.Пособие адресовано учителям, ученикам, их родителям и всем, кому необходимо закрепить и систематизировать знания перед ЕГЭ.
Цель предлагаемого пособия – систематизировать и обогатить представления о природе, структуре и особенностях художественной литературы как вида искусства, помочь совершенствованию читательского мастерства. Книга снабжена кратким словарем основных литературоведческих понятий и терминов (составлен при участии доцента О.В. Быстровой).Для студентов филологических факультетов, учителей, преподавателей литературы высших и средних учебных заведений.