函数的纯脚本 Eq 类型 class

Purescript Eq type class for function

data L = A | B
data H a = H a
data X a = Some (L -> H a)

我正在尝试推导 X 的方程式:

derive instance eqX :: Eq a => Eq (X a)  

并得到错误:

 No type class instance was found for

    Data.Eq.Eq (L -> H a1)

derive/define 如何为这个简单的案例实例化 Eq X?

您需要为函数类型提供一个 Eq 实例,以便为包含函数的类型自动派生它。这有点问题,因为函数比较可以用许多不同的方式来理解。想一想;什么时候两个函数等价?

  • 当它们在数学上相同时(即,对于相同的参数 return 相同的结果或崩溃)
  • 当它们在语义上相同时(即,对于相同的参数 return 相同的结果,或分别循环,或以相同的方式崩溃;它们也应该有共同的副作用吗?)
  • 当它们在代码中的相同位置定义时
  • 同上但必须有相同的闭包(这是 Erlang 所做的)
  • 当它们相同 功能时(参考)
  • 从不 (?)
  • ...

这就是功能类型没有 Eq 实例的原因。我不建议写一个,​​因为这会导致一个孤立的实例,并传播关于上述困境的歧义语义。

如果您有一些计划的语义,您可以为 X 手动编写一个实例。请注意,您应该期望保留一些基本法则,例如

  • x == x – 自反性
  • (y == x) == (x == y) – 对称性
  • not ((x == y) && (y == z)) || (x == z) – 传递性

但老实说,我不认为一般比较函数是个好主意。