Я пытаюсь понять класс числового типа иерархия в Haskell. Основной числовой тип

class Num a where
...

В качестве примечания, согласно некоторым из моих источников (слайдов), на самом деле это должно быть

class Eq a => Num a where
...

Но я не могу найти этого в Прелюдии.

Теперь меня интересует класс типа Real

class (Num a, Ord a) => Real a where
  -- the rational equivalent of its real argument with full precision
  toRational :: a -> Rational

Я предполагаю, что Real относится к тому факту, что типы, являющиеся экземплярами Real, не являются сложными. Но мое понимание числа Real из математики состоит в том, что оно может быть рациональным и иррациональным , поэтому нет эквивалента toRational для всех их. Конечно, иррациональные числа в любом случае нельзя использовать в компьютерах ...

Спасибо!

5
Dominik Schrempf 20 Сен 2018 в 12:38

2 ответа

Лучший ответ

Да, имя Real - довольно вводящее в заблуждение название класса типов, которые можно преобразовать в рациональные.

Действительно, у нас есть такие примеры, как Real Integer, Real IntPtr, Real CBool, которые могут быть очень удивительными.

Стандартные числовые классы обычно считаются немного странными как по названию, так и по общему дизайну.

7
chi 20 Сен 2018 в 09:51

В общем, числовые классы Haskell немного запутаны. Они определены таким образом, чтобы было удобно и легко использовать основные числовые типы, такие как Int, Integer, Double и т. Д. Но когда вы начинаете хотеть более сложные типы чисел ... они не всегда имеют смысл.


По поводу Num: это интересно. И Haskell '98, и Haskell 2010 Report требуют, чтобы

class (Eq a, Show a) => Num a

Если вы посмотрите документацию для base-4.0.0.0, вы обнаружите, что это так:

http://hackage.haskell.org/package/base-4.0.0.0/docs/Prelude.html#7

Однако в какой-то момент пакет base был изменен таким образом, что Num теперь не имеет суперклассов (что противоречит Отчету). Итак, ваши слайды не ошибочны; он раньше определялся таким образом, но в какой-то момент он был изменен. Если копнуть достаточно глубоко, вероятно, есть билет или вики-страница об этом.


Что касается Real ... да, название вводит в заблуждение. Я также не совсем понимаю, почему он отличается от RealFrac, который также касается преобразований числа в различные соотношения или целые числа.


Если вас интересуют такие вещи, существуют различные «альтернативные библиотеки Prelude» (например, «classy Prelude», «numeric Prelude»), которые заменяют стандартный Prelude чем-то, надеюсь, немного более разумным. Оказывается, сделать это действительно хорошо на удивление сложно - вот почему официальная спецификация практически не изменилась. Никто не предложил ничего лучше.

4
MathematicalOrchid 20 Сен 2018 в 10:29