5

我正在使用Data.Ratio连分数的收敛)实现算法。但是,我遇到了两个障碍:

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

我正在探索hackage。特别是来源似乎正在使用这些功能(例如定义infinity = 1 :% 0或模式匹配numerator)。

作为初学者,我也很困惑在哪里确定(%),numerator和这样的暴露给我,但不是infinityand (:%)

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

4

1 回答 1

6

它们的出口并不是为了防止人们做这样的事情。看,类型

data Ratio a = a:%a

包含太多值。特别是,例如2/63/9实际上是 ℚ 中的相同数字,并且都由 表示1:%3。因此,2:%6实际上是一个非法值,当然,1:%0. 或者它可能是合法的,但所有函数都知道如何处理它们,所以2:%6对于所有可观察的方法来说,1:%3我实际上不知道 GHC 选择了哪些选项,但无论如何它是一个实现细节,可能会在未来的版本中改变不知不觉中。

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

所以——如果你发现自己用 开始了一个算法1/0,那么你确实不应该Ratio在那里使用,而只是将分子和分母存储在一个没有此类问题的普通元组中,并且只使最终结果 aRatio%

于 2020-08-07T08:47:21.677 回答