我是否可以仅为lambdas禁用“非详尽模式匹配”警告?

时间:2012-02-05 09:35:34

标签: haskell lambda warnings ghc

我是否可以仅针对lambdas禁用非详尽模式匹配警告?

我喜欢一般的警告,但不喜欢这样的实际lambda文字:

map (\(x:xs)->...) ls

我认为这段代码非常清楚我希望ls的所有值总是至少有一个元素,并且没有简洁的方法来处理lambda中的错误情况。 (我想我可以将模式匹配移动到case语句中,但那只会很难看。)

5 个答案:

答案 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

然后在“伤口”中可以描述为什么不应该发生这种情况。