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



我正在使用Data.Ratio(连续分数的收敛(实现一个算法。然而,我遇到了两个障碍:

  • 算法从分数1%0开始,但这会引发零分母异常
  • 我想对构造函数a :% b进行模式匹配

我在探索黑客技术。特别是,源似乎正是在使用这些特征(例如,定义infinity = 1 :% 0numerator的模式匹配(。

作为初学者,我也很困惑哪里确定(%)numerator等暴露在我面前,而不是infinity(:%)

我已经用一组整数做了一个肮脏的变通方法,但对如此琐碎的事情重新发明轮子似乎很愚蠢。了解如何读取公开的函数的源代码也是很好的。

导出它们并不是为了防止人们做这样的事情。请参阅,类型

data Ratio a = a:%a

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

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

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

最新更新