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

时间:2013-10-15 05:31:26

标签: haskell vector ghc gadt non-exhaustive-patterns

我有以下代码

{-# 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扩展无关?他们应该互相了解吗?此功能(考虑扩展的警告)是否适用于将来的版本,或者是否存在实施此功能的技术限制?

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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