类型类法则是在什么平等概念下编写的?
Under what notion of equality are typeclass laws written?
Haskell 类型类通常是有规律的;例如, Monoid
are expected 的实例观察 x <> mempty = mempty <> x = x
.
Typeclass 法则通常使用单等号 (=
) 而不是双等号 (==
)。这表明类型类法则中使用的平等概念不同于 Eq
(这是有道理的,因为 Eq
不是 Monoid
的超类)
四处寻找,没能找到关于=
在typeclass laws中含义的权威说法。例如:
- Haskell 2010 report连“法”字都没有
- 与其他 Haskell 用户交谈,大多数人似乎认为
=
通常意味着外延相等或替代,但从根本上说是上下文相关的。没有人为此声明提供任何权威来源。
- Haskell wiki article on monad 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 对。在编程中,我们改为定义运算符 ==
来判断两对是否相等,即它们是否代表相同的分数。
Haskell 类型类通常是有规律的;例如, Monoid
are expected 的实例观察 x <> mempty = mempty <> x = x
.
Typeclass 法则通常使用单等号 (=
) 而不是双等号 (==
)。这表明类型类法则中使用的平等概念不同于 Eq
(这是有道理的,因为 Eq
不是 Monoid
的超类)
四处寻找,没能找到关于=
在typeclass laws中含义的权威说法。例如:
- Haskell 2010 report连“法”字都没有
- 与其他 Haskell 用户交谈,大多数人似乎认为
=
通常意味着外延相等或替代,但从根本上说是上下文相关的。没有人为此声明提供任何权威来源。 - Haskell wiki article on monad 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 对。在编程中,我们改为定义运算符 ==
来判断两对是否相等,即它们是否代表相同的分数。