我有以下代码
{-# 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扩展无关?他们应该互相了解吗?此功能(考虑扩展的警告)是否适用于将来的版本,或者是否存在实施此功能的技术限制?
似乎解决方案很简单;编译器可以尝试将所谓的不匹配模式添加到函数中,并再次询问类型检查器是否建议的模式是良好类型的。如果是,那么它确实可以作为缺失模式报告给用户。
答案 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。