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

问题描述 投票:13回答:5

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

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

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

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

haskell lambda warnings ghc
5个回答
15
投票

是的,但仅限于GHC 7.2以后;通过-fno-warn-incomplete-uni-patterns(例如在您的Cabal文件的ghc-options字段中,或在文件顶部的{-# OPTIONS_GHC #-}编译指示中)。

但是,这也会禁用模式绑定的警告,因此let Just x = Nothing in x不会产生警告。 case声明不受影响。


6
投票

你经常遇到这种情况吗?这是代码味道恕我直言。我想看看一些这样的lambdas,我很确定我们可以制作一个更好的版本,也可以很好地处理空列表。在所有其他情况下,您可能会选择NonEmpty列表类型包装器。


4
投票

map的情况下,您可以将其写为列表理解。

[... | (x:xs) <- ls]

这不会产生任何警告。虽然,如果显示一个空列表,这将简单地过滤掉它而不是抛出异常,这可能会隐藏错误。如果您担心这一点,那么走向类型安全路线as Ingo suggests可能是更好的选择。


3
投票

我会去{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}而不是{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}。我建议使用per-file方法而不是将其放入cabal文件中,因为通常很好的做法是不断收到此类警告。


0
投票

你可以写

{-# LANGUAGE LambdaCase #-}
map (\case (x:xs)->...; [] -> error "wut") ls

在“wut”中你可以描述为什么不应该发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.