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实例.
所以我的问题是,如何在无限类型上进行模式匹配?
问题不在于模式匹配或您的实例实现.您的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
任何(相同的)类型参数,那将会更令人满意......
归档时间: |
|
查看次数: |
351 次 |
最近记录: |