4

我正在 PureScript 中使用以下代数数据类型...

data Extended a = Infinite | Finite a

v1 = Finite 11
v2 = Infinite

我无法弄清楚如何与“无限”案例进行模式匹配,因为它似乎v2具有 type forall t140. Extended t140。我假设 t140 是编译器自动填充的某种占位符。 v1 的类型是Extended Int. 因此,如果我设置一个 Eq 实例来比较 Extended 的值,则 Infinite 大小写不匹配...

instance extendedEq :: (Eq a) => Eq (Extended a) where
  eq (Finite a) (Finite b) = eq a b
  eq Infinite Infinite = true
  eq Infinite _ = false
  eq _ Infinite = false

所以当我尝试运行时,v2 == v2我得到了错误......

No type class instance was found for Prelude.Eq (Extended _0)

这是有道理的,因为我想它正在尝试为 t140 找到一个 Eq 实例。

所以我的问题是,如何在 Infinite 类型上进行模式匹配?

4

1 回答 1

6

问题不在于模式匹配或您的实例实现。您的 ADT 具有相同的结构Maybe,如果我尝试

main = print (Nothing == Nothing)

我得到错误代码:https ://github.com/purescript/purescript/wiki/Error-Code-NoInstanceFound

您的类型参数t140可以是Eq类型类中的任何内容,因此编译器无法选择实例。您需要为 的至少一个操作数添加类型注释==

v2 = Infinite :: Extended Int

Infinite == Infinite但我承认,如果编译器能够为任何(相同)类型参数找出这一点会更令人满意......

于 2016-04-18T07:30:50.693 回答