Непонятно, почему функции из Data.Ratio не отображаются и как их обойти - PullRequest
5 голосов
/ 07 августа 2020

Я реализую алгоритм, использующий Data.Ratio ( подходящие дроби непрерывных дробей ). Однако я сталкиваюсь с двумя препятствиями:

  • Алгоритм начинается с дроби 1%0 - но это вызывает исключение с нулевым знаменателем.
  • Я хотел бы сопоставить шаблон с конструктором a :% b

Я исследовал взлом . В частности, источник , похоже, использует именно эти функции (например, определение infinity = 1 :% 0 или сопоставление с образцом для numerator).

Как новичок, я также не понимаю, где это определил, что (%), numerator и тому подобное доступны мне, но не infinity и (:%).

Я уже сделал грязный обходной путь, используя кортеж целых чисел, но кажется глупым изобретать велосипед в такой тривиальной ситуации. Также было бы неплохо узнать, как читать исходный код, какие функции доступны.

1 Ответ

6 голосов
/ 07 августа 2020

Они не экспортируются именно для того, чтобы люди не могли делать подобные вещи. Видите ли, тип

data Ratio a = a:%a

содержит слишком много значений . В частности, например, 2/6 и 3/9 на самом деле это одно и то же число в ℚ, и оба представлены 1:%3. Таким образом, 2:%6 на самом деле является недопустимым значением, и, конечно же, 1:%0. или это может быть законным, но все функции знают, как с ними обращаться, поэтому 2:%6 для всех наблюдаемых средств равно 1:%3 - я фактически не знаю, какой из этих вариантов выбирает GH C , но, в любом случае, это деталь реализации, которая может измениться в будущих выпусках без предварительного уведомления.

Если сами авторы библиотеки используют такие значения, например, для уловок оптимизации, это одно - в конце концов, они полностью контролируют любые алгоритмы 1031 * подробности и любое неопределенное поведение, которое может возникнуть. Но если пользователи должны создать такие значения, это приведет к нестабильному коду.

Итак - если вы обнаружите, что начинаете алгоритм с 1/0, тогда вам действительно не следует использовать Ratio вообще есть, но просто сохраните числитель и знаменатель в простом кортеже, который не имеет таких проблем, и только сделайте окончательный результат Ratio с %.

...