类型类法则是在什么平等概念下编写的?

Under what notion of equality are typeclass laws written?

Haskell 类型类通常是有规律的;例如, Monoid are expected 的实例观察 x <> mempty = mempty <> x = x.

Typeclass 法则通常使用单等号 (=) 而不是双等号 (==)。这表明类型类法则中使用的平等概念不同于 Eq(这是有道理的,因为 Eq 不是 Monoid 的超类)

四处寻找,没能找到关于=在typeclass laws中含义的权威说法。例如:

问题,那么:=在typeclass laws的语义上有没有权威的出处或标准?如果是这样,它是什么?此外,是否有例子表明 = 的预期含义特别奇特?


(附带说明,扩展处理 = 可能会变得棘手。例如,有一个 Monoid (IO a) 实例,但尚不清楚 IO 值的扩展相等性看起来像。)

Typeclass 法则不是 Haskell 语言的一部分,因此它们不受与语言本身相同的 language-theoretic 语义分析。

相反,这些定律通常以非正式的数学符号形式呈现。大多数演示文稿不需要更详细的数学阐述,因此他们不提供。

我怀疑大多数人使用 = 来表示从 Fast and Loose Reasoning is Morally Correct 开始的“道德平等”,您可以将其视为 defined-ness 之前的外延平等。

但是这里没有 hard-and-fast 规则。有很多图书馆和很多作者,如果你选择任何两位作者,他们可能有一些关于 = 的细节他们不同意。

我同意 ,这些定律中的等式是数学语言中的等式。但我还要说,这是对运营商的尊重 ==.

为什么?因为 == 应该实现数学相等。

例如,看分数(有理数)。它们可以作为具有某些规则的整数对来实现。 (a, b) 对表示分数 a/b。如果 a*d == b*c(a, b)(c, d) 对表示相同的有理数。然后说这两个对是等价的,我们在这个等价下讨论 equivalence relation. In mathematics we let a rational number be an equivalence class 对。在编程中,我们改为定义运算符 == 来判断两对是否相等,即它们是否代表相同的分数。