Наследование классов
Также можно создавать классы типов, которые являются подклассами других классов типов. Декларация класса Num довольно длинна, но вот её начало:
class (Eq a) => Num a where
...
Как уже говорилось ранее, есть множество мест, куда мы можем втиснуть ограничения на класс. Наша запись равнозначна записи class Num a where, но мы требуем, чтобы тип a имел экземпляр класса Eq. Это означает, что мы должны определить для нашего типа экземпляр класса Eq до того, как сможем сделать для него экземпляр класса Num. Прежде чем некоторый тип сможет рассматриваться как число, мы должны иметь возможность проверять значения этого типа на равенство.
Ну вот и всё, что надо знать про наследование, – это просто ограничения на класс типа-параметра при объявлении класса. При написании тел функций в декларации класса или при их определении в экземпляре класса мы можем полагать, что тип a имеет экземпляр для класса Eq и, следовательно, допускается использование операторов == и /= со значениями этого типа.