(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
会更令人满意...
我在 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
会更令人满意...