我可以让-Wincomplete模式更严格吗?



使用 GHC,我可以让-Wincomplete-patterns捕捉到像这两个这样的错误情况。

problem1 :: Either Int String -> Int
problem1 (Left x) = x
problem2 :: Either Int String -> Int
problem2 x = case x of
               Left x' -> x'

显然,我忘记了在这两个功能中处理Right情况,GHC会告诉我这一点。但是,在这两种情况下,编译器似乎甚至没有警告就让我离开了。

problem3 :: Either Int String -> Int
problem3 x = let Left x' = x in x'
problem4 :: Either Int String -> Int
problem4 = (Left x) -> x

我仍然忘记处理案件,但GHC似乎并不在意。是否有一个编译器标志,我可以设置一个编译器标志来捕获这样的情况,其中我使用 let 或 lambda 模式匹配但没有处理所有情况?理想情况下,如果我做这样的事情,我希望得到警告,以便我可以将其重构为case语句或类似内容。

当然,为了完整性和后代,与其他编译器相关的答案也受到高度赞赏。

看来-Wincomplete-uni-patterns就是你需要的。作为一个基本上一直使用-Wall的人,我发现这些情况没有被-Wall-Wincomplete-patterns涵盖的事实令人惊讶和糟糕。

编辑:似乎GHC将其添加到-Wall的提案已被接受。我不确定状态(我在 8.4 上检查过):https://github.com/ghc-proposals/ghc-proposals/pull/71

相关内容

  • 没有找到相关文章

最新更新