不清楚为什么 Data.Ratio 中的函数没有公开以及如何解决

Unclear why functions from Data.Ratio are not exposed and how to work around

我正在使用 Data.Ratio (convergents of continued fractions) 实现算法。 然而,我遇到了两个障碍:

我在 hackage. An in particular the source 上探索似乎正在使用这些功能(例如定义 infinity = 1 :% 0,或 numerator 的模式匹配)。

作为初学者,我也很困惑,我也很困惑,在什么地方确定(%)numerator等暴露给我,而不是infinity(:%)

我已经使用整数元组做了一个肮脏的解决方法,但是为了如此微不足道的事情重新发明轮子似乎很愚蠢。 也很高兴了解如何阅读公开哪些功能的源代码。

它们并没有准确地导出以防止人们做这样的事情。看,类型

data Ratio a = a:%a

包含 太多值。特别是,例如2/63/9 实际上是 相同的数字 在ℚ 中,都用 1:%3 表示。因此,2:%6 实际上是一个 非法 值,当然 1:%0 也是如此。 它可能是合法的,但所有函数都知道如何处理它们,所以 2:%6 是所有可观察到的均值等于 1:%3 – 我实际上不知道哪个这些选项是 GHC 选择的,但无论如何它是一个实现细节,可能会在未来的版本中更改,恕不另行通知。

如果图书馆作者自己使用这些值,例如优化技巧是一回事——他们毕竟可以完全控制任何算法细节和任何可能出现的未定义行为。但是,如果 users 必须构造这样的值,则会导致代码脆弱。

所以——如果你发现自己用 1/0 开始一个算法,那么你根本不应该在那里使用 Ratio,而是简单地将分子和分母存储在一个普通元组中,它没有这样的元组问题,并且只使最终结果成为 Ratio%.