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