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