(Purescript)如何在 "empty type" 的代数数据类型上进行模式匹配

(Purescript) How do I pattern match on an algebraic data type that is the "empty type"

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

data Extended a = Infinite | Finite a

v1 = Finite 11
v2 = Infinite

我无法弄清楚如何模式匹配 "Infinite" 大小写,因为 v2 的类型似乎是 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 类型上进行模式匹配?

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

main = print (Nothing == Nothing)

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

您的类型参数 t140 可以是 Eq 类型 class 中的任何内容,因此编译器无法 select 一个实例.您需要为 ==:

的至少一个操作数添加类型注释
v2 = Infinite :: Extended Int

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