我是否可以仅针对lambdas禁用非详尽模式匹配警告?
我喜欢一般的警告,但不喜欢这样的实际lambda文字:
map (\(x:xs)->...) ls
我认为这段代码非常清楚我希望ls
的所有值总是至少有一个元素,并且没有简洁的方法来处理lambda中的错误情况。 (我想我可以将模式匹配移动到case
语句中,但那只会很难看。)
答案 0 :(得分:15)
是的,但仅限于GHC 7.2以后;通过-fno-warn-incomplete-uni-patterns
(例如,在您的Cabal文件的ghc-options
字段中,或者在文件顶部的{-# OPTIONS_GHC #-}
pragma中)。
但是,这也会禁用模式绑定的警告,因此let Just x = Nothing in x
不会产生警告。 case
语句不受影响。
答案 1 :(得分:6)
你经常遇到这种情况吗?这是代码味道恕我直言。我想看看一些这样的lambdas,我很确定我们可以制作一个更好的版本,也可以很好地处理空列表。在所有其他情况下,您可能会使用NonEmpty
列表类型包装器。
答案 2 :(得分:4)
在map
的情况下,您可以将其写为列表理解。
[... | (x:xs) <- ls]
这不会产生任何警告。虽然,如果出现一个空列表 ,这只会将其过滤而不是抛出异常,这可能会隐藏错误。如果您对此感到担忧,那么选择类型安全路线as Ingo suggests可能是更好的选择。
答案 3 :(得分:3)
我会选择{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
代替{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
。我建议使用per-file方法而不是将其放入cabal文件中,因为通常很好的做法是不断收到此类警告。
答案 4 :(得分:0)
你可以写
{-# LANGUAGE LambdaCase #-}
map (\case (x:xs)->...; [] -> error "wut") ls
然后在“伤口”中可以描述为什么不应该发生这种情况。