如何解决函数的 Purescript Eq 类型类
data L = A | B
data H a = H a
data X a = Some (L -> H a)
我正在尝试为 X 推导出 Eq:
derive instance eqX :: Eq a => Eq (X a)
并得到错误:
No type class instance was found for
Data.Eq.Eq (L -> H a1)
如何为这个简单的案例派生/定义实例 Eq X?
解决方法
您需要为函数类型提供一个 Eq
实例,以便为包含函数的类型自动派生它。这有点问题,因为函数比较可以通过许多不同的方式来理解。想一想;什么时候两个函数是等价的?
- 当它们在数学上相同时(即,对于相同的参数,返回相同的结果或崩溃)
- 当它们在语义上相同时(即,对于相同的参数,返回相同的结果,或分别循环,或以相同的方式崩溃;它们是否也应该共享副作用?)
- 当它们在代码中的相同位置定义时
- 同上,但必须有相同的闭包(这就是 Erlang 所做的)
- 当它们相同函数(参考)
- 从不 (?)
- ...
这就是函数类型没有提供 Eq
实例的原因。我不建议写一个,因为这会导致一个孤立的实例并传播关于上述困境的歧义语义。
如果您有一些计划好的语义,您可以做的是手动为 X
编写一个实例。请注意,您应该期望保留一些基本定律,例如
-
x == x
– 反身性 -
(y == x) == (x == y)
– 对称性 -
not ((x == y) && (y == z)) || (x == z)
– 传递性
但老实说,我认为比较一般的函数并不是一个好主意。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。