20090410

Иерархия числовых типов в Haskell

В Хаскеле очень затейливая иерархия числовых типов. Всё дело в том, что кроме обычных машинных целых и чисел с плавующей точкой, в ней нашлось место и числам произвольной точности (настоящим целым и рациональным), и комплексным, и числам с фиксированной точностью.

Цитирую по официальному описанию языка:
Класс Num числовых типов является подклассом класса Eq, так как все числа можно сравнить на равенство; его подкласс Real также является подклассом класса Ord, так как остальные операции сравнения применимы ко всем числам, за исключением комплексных (определенных в библиотеке Complex). Класс Integral содержит целые числа ограниченного и неограниченного диапазона; класс Fractional содержит все нецелые типы; а класс Floating содержит все числа с плавающей точкой, действительные и комплексные.
С одной стороны, система устроена очень логично: введение дополнительных операций расширяет множество чисел. Так, деление целых дополняет целые — рациональными. Логарифмы и экспоненты требуют действительных. Однако сразу представить и запомнить всю иерархию классов непросто. Лучше один раз увидеть! Поэтому хозяйке себе на заметку и другим на потеху я составил вот такую памятку:


Исходник диаграммы

Оформил как «диаграмму классов», чтобы всем привыкшим к ООП было понятно, что от чего «наследуется» (линия со стрелкой к родителю). Почти все эти типы являются абстрактными («интерфейсами» в ОО-терминологии). Конкретные же числовые типы я обвёл серыми рамочками (можно было обвести и Ratio). Полиморфные классы обозначил прямоугольниками со скруглёнными углами. Типы параметров таких полиморфных классов указал «аггрегацией» (линия с ромбиком на стороне полиморфного класса). При составлении ориентировался на первоисточник.

Also in English.