提问人:Quelklef 提问时间:2/25/2022 最后编辑:Quelklef 更新时间:2/27/2022 访问量:296
类型类定律是在什么平等概念下编写的?
Under what notion of equality are typeclass laws written?
问:
Haskell类型类通常带有定律;例如,实例应观察到 .Monoid
x <> mempty = mempty <> x = x
类型类定律通常用单等号()而不是双等号()来编写。这表明类型类法律中使用的相等概念不是 (这是有道理的,因为不是=
==
Eq
Eq
Monoid
)
四处搜索,我找不到任何关于类型类法律含义的权威声明。例如:=
- Haskell 2010 报告甚至没有包含“法律”一词
- 与其他 Haskell 用户交谈时,大多数人似乎认为这通常意味着扩展相等或替换,但从根本上依赖于上下文。没有人为这一说法提供任何权威来源。
=
- Haskell wiki 上关于单子定律的文章指出这是扩展的,但同样未能提供来源,我无法找到任何联系相关编辑作者的方法。
=
那么问题来了:类型类法则的语义是否有任何权威的来源或标准?如果是这样,它是什么?此外,是否有示例中的预期含义特别具有异国情调?=
=
(顺便说一句,延伸治疗可能会变得棘手。例如,有一个实例,但并不真正清楚值的扩展相等性是什么样子的。=
Monoid (IO a)
IO
答:
类型类定律不是 Haskell 语言的一部分,因此它们不受与语言本身相同的语言理论语义分析的影响。
相反,这些定律通常以非正式的数学符号形式呈现。大多数演示文稿不需要更详细的数学阐述,因此它们不提供。
评论
=
我怀疑大多数人习惯于“道德平等”,因为来自快速和松散的推理是道德正确的,你可以将其视为延伸到定义性的平等。=
但这里没有硬性规定。有很多图书馆,很多作者,如果你选择任何两个作者,他们可能有一些他们不同意的小细节。=
评论
State
State
x <$ undefined = x
x <$ undefined = pure x
我同意即将到来的风暴,即这些定律的平等是数学语言的平等。但我也要说,这是在运营商的尊重。==
为什么?因为应该实现数学相等。==
例如,查看分数(有理数)。它们可以实现为具有一些规则的整数对。该对表示分数。如果 ,则对 和 表示相同的有理数。然后说这两个对是等价的,我们谈论等价关系。在数学中,我们让有理数成为该等价下对的等价类。在编程中,我们定义运算符来判断两对是否相等,即它们是否代表相同的分数。(a, b)
a/b
(a, b)
(c, d)
a*d == b*c
==
评论
=
lhs = rhs
lhs
rhs