Является ли класс типа Haskell 'Real' неправильным? - PullRequest
0 голосов
/ 20 сентября 2018

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

class Num a where
...

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

class Eq a => Num a where
...

, но я не могу найти его в Prelude.

Теперь меня интересует класс типов 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.Конечно, иррациональные числа нельзя использовать в компьютерах в любом случае ...

Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вообще, классы чисел в 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 (например, "классная Prelude", "числовая Prelude"), которые заменяют стандартную Prelude чем-то, что, возможно, будет более разумным.Оказывается, на удивление сложно сделать это действительно хорошо - вот почему официальная спецификация не сильно изменилась.Никто не предложил что-либо окончательно лучше.

0 голосов
/ 20 сентября 2018

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

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

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

...