不清楚为什么 Data.Ratio 中的函数没有公开以及如何解决
Unclear why functions from Data.Ratio are not exposed and how to work around
我正在使用 Data.Ratio
(convergents of continued fractions) 实现算法。
然而,我遇到了两个障碍:
- 算法从分数
1%0
开始 - 但是这会引发零分母异常。
- 我想模式匹配构造函数
a :% b
我在 hackage. An in particular the source 上探索似乎正在使用这些功能(例如定义 infinity = 1 :% 0
,或 numerator
的模式匹配)。
作为初学者,我也很困惑,我也很困惑,在什么地方确定(%)
、numerator
等暴露给我,而不是infinity
和(:%)
。
我已经使用整数元组做了一个肮脏的解决方法,但是为了如此微不足道的事情重新发明轮子似乎很愚蠢。
也很高兴了解如何阅读公开哪些功能的源代码。
它们并没有准确地导出以防止人们做这样的事情。看,类型
data Ratio a = a:%a
包含 太多值。特别是,例如2/6
和 3/9
实际上是 相同的数字 在ℚ 中,都用 1:%3
表示。因此,2:%6
实际上是一个 非法 值,当然 1:%0
也是如此。 或 它可能是合法的,但所有函数都知道如何处理它们,所以 2:%6
是所有可观察到的均值等于 1:%3
– 我实际上不知道哪个这些选项是 GHC 选择的,但无论如何它是一个实现细节,可能会在未来的版本中更改,恕不另行通知。
如果图书馆作者自己使用这些值,例如优化技巧是一回事——他们毕竟可以完全控制任何算法细节和任何可能出现的未定义行为。但是,如果 users 必须构造这样的值,则会导致代码脆弱。
所以——如果你发现自己用 1/0
开始一个算法,那么你根本不应该在那里使用 Ratio
,而是简单地将分子和分母存储在一个普通元组中,它没有这样的元组问题,并且只使最终结果成为 Ratio
和 %
.
我正在使用 Data.Ratio
(convergents of continued fractions) 实现算法。
然而,我遇到了两个障碍:
- 算法从分数
1%0
开始 - 但是这会引发零分母异常。 - 我想模式匹配构造函数
a :% b
我在 hackage. An in particular the source 上探索似乎正在使用这些功能(例如定义 infinity = 1 :% 0
,或 numerator
的模式匹配)。
作为初学者,我也很困惑,我也很困惑,在什么地方确定(%)
、numerator
等暴露给我,而不是infinity
和(:%)
。
我已经使用整数元组做了一个肮脏的解决方法,但是为了如此微不足道的事情重新发明轮子似乎很愚蠢。 也很高兴了解如何阅读公开哪些功能的源代码。
它们并没有准确地导出以防止人们做这样的事情。看,类型
data Ratio a = a:%a
包含 太多值。特别是,例如2/6
和 3/9
实际上是 相同的数字 在ℚ 中,都用 1:%3
表示。因此,2:%6
实际上是一个 非法 值,当然 1:%0
也是如此。 或 它可能是合法的,但所有函数都知道如何处理它们,所以 2:%6
是所有可观察到的均值等于 1:%3
– 我实际上不知道哪个这些选项是 GHC 选择的,但无论如何它是一个实现细节,可能会在未来的版本中更改,恕不另行通知。
如果图书馆作者自己使用这些值,例如优化技巧是一回事——他们毕竟可以完全控制任何算法细节和任何可能出现的未定义行为。但是,如果 users 必须构造这样的值,则会导致代码脆弱。
所以——如果你发现自己用 1/0
开始一个算法,那么你根本不应该在那里使用 Ratio
,而是简单地将分子和分母存储在一个普通元组中,它没有这样的元组问题,并且只使最终结果成为 Ratio
和 %
.