繁体   English   中英

GHC抱怨类型检查器强制执行的非详尽模式

[英]GHC complains about non-exhaustive patterns that are enforced by the type checker

我有以下代码

{-# LANGUAGE DataKinds, GADTs, TypeOperators #-}

data Vect v a where
    Nil :: Vect '[] a
    Vec :: a -> Vect v a -> Vect (() ': v) a 

instance Eq a => Eq (Vect v a) where
    (==) Nil Nil               = True
    (Vec e0 v0) == (Vec e1 v1) = e0 == e1 && v0 == v1

使用-Wall编译或解释时,会给出以下警告:

Pattern match(es) are non-exhaustive
In an equation for `==':
    Patterns not matched:
        Nil (Vec _ _)
        (Vec _ _) Nil

通常这是预料之中的。 通常情况下,即使我可以推断我的模式将涵盖所有可能的情况,编译器也无法在不运行代码的情况下知道。 但是,所提供模式的详尽性由类型检查器强制执行,该类型检查器在编译时运行。 添加GHC建议的模式会产生编译时错误:

Couldn't match type '[] * with `(':) * () v1'

所以我的问题是:GHC警告是否与GHC扩展无关? 他们应该互相了解吗? 此功能(考虑扩展的警告)是否适用于将来的版本,或者是否存在实施此功能的技术限制?

似乎解决方案很简单; 编译器可以尝试将所谓的不匹配模式添加到函数中,并再次询问类型检查器是否建议的模式是良好类型的。 如果是,那么它确实可以作为缺失模式报告给用户。

这看起来像一个错误 - 这是一个稍微简单的版本:

data Foo :: Bool -> * where
    A :: Foo False
    B :: Foo True

hmm :: Foo b -> Foo b -> Bool
hmm A A = False
hmm B B = True

它看起来像是一个已知的bug,或者是已知错误家族的一部分 - 我能在几分钟内找到的最接近的是#3927

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM