函数的纯脚本 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)
– 传递性
但老实说,我不认为一般比较函数是个好主意。
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)
– 传递性
但老实说,我不认为一般比较函数是个好主意。