(Purescript)如何在代数数据类型上模式匹配"空类型"

Alb*_*rly 3 equality pattern-matching algebraic-data-types purescript

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

data Extended a = Infinite | Finite a

v1 = Finite 11
v2 = Infinite
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何模式匹配"无限"情况,因为它似乎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
Run Code Online (Sandbox Code Playgroud)

因此,当我尝试运行时,v2 == v2我得到错误...

No type class instance was found for Prelude.Eq (Extended _0)
Run Code Online (Sandbox Code Playgroud)

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

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

sth*_*lzm 5

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

main = print (Nothing == Nothing)
Run Code Online (Sandbox Code Playgroud)

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

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

v2 = Infinite :: Extended Int
Run Code Online (Sandbox Code Playgroud)

但我承认,如果编译器可以找出Infinite == Infinite任何(相同的)类型参数,那将会更令人满意......