我正在使用Data.Ratio
(连续分数的收敛(实现一个算法。然而,我遇到了两个障碍:
- 算法从分数
1%0
开始,但这会引发零分母异常 - 我想对构造函数
a :% b
进行模式匹配
我在探索黑客技术。特别是,源似乎正是在使用这些特征(例如,定义infinity = 1 :% 0
或numerator
的模式匹配(。
作为初学者,我也很困惑哪里确定(%)
、numerator
等暴露在我面前,而不是infinity
和(:%)
。
我已经用一组整数做了一个肮脏的变通方法,但对如此琐碎的事情重新发明轮子似乎很愚蠢。了解如何读取公开的函数的源代码也是很好的。
导出它们并不是为了防止人们做这样的事情。请参阅,类型
data Ratio a = a:%a
包含太多值。特别是,例如2/6
和3/9
实际上是中的相同数字ℚ并且两者都由CCD_ 12表示。因此,2:%6
实际上是一个非法值,1:%0
也是如此或者这可能是合法的,但所有函数都知道如何处理它们,所以2:%6
表示所有可观察的均值等于1:%3
——事实上,我不知道GHC选择了这些选项中的哪一个,但无论如何,这是一个实现细节,可能会在未来的版本中更改,恕不另行通知。
如果库作者自己将这些值用于优化技巧,那是一回事——毕竟他们可以完全控制任何算法细节和可能出现的任何未定义行为。但是,如果用户必须构造这样的值,就会导致代码变得脆弱。
因此,如果你发现自己用1/0
开始一个算法,那么你确实不应该在那里使用Ratio
,而应该简单地将分子和分母存储在一个普通元组中,这没有这样的问题,并且只使用%
使最终结果为Ratio
。