【问题标题】:Purescript Eq type class for function函数的 Purescript Eq 类型类
【发布时间】:2021-01-13 18:00:21
【问题描述】:
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?

【问题讨论】:

  • 你认为应该如何比较功能?是什么让两个函数彼此相等?
  • 好的,我相信不会明白的。

标签: purescript


【解决方案1】:

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

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

这就是函数类型没有 Eq 实例的原因。我不建议编写一个,因为这会导致孤儿实例并传播关于上述困境的模棱两可的语义。

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

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

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

【讨论】:

    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多