[英]How can I get GHC to warn about incomplete pattern bindings in do blocks?
下面的 Haskell 程序被破坏了,因为它做了一个不完整的模式绑定:
main = do
[x] <- pure ["foo", "bar"]
print x
如果你编译它,你不会得到警告:
$ ghc -fwarn-incomplete-uni-patterns -o example example.hs
[1 of 1] Compiling Main ( example.hs, example.o )
Linking example ...
但如果你运行它,你会得到:
example: user error (Pattern match failure in do expression at example.hs:2:3-5)
我想以某种方式收到编译器警告。
从文档中,我原以为-fwarn-incomplete-uni-patterns
会这样做,因为do
块 desugars 到:
desugared = pure ["foo", "bar"] >>= \[x] -> print x
事实上,将其添加到示例文件中确实会产生警告:
$ ghc -fwarn-incomplete-uni-patterns -o example example.hs
[1 of 1] Compiling Main ( example.hs, example.o )
example.hs:1:37: Warning:
Pattern match(es) are non-exhaustive
In a lambda abstraction:
Patterns not matched:
[]
_ : (_ : _)
当我在do
块中做同样的事情时,如何得到类似的警告?
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.10.3
至于现在,为了避免由于这种怪癖而导致的错误,您唯一可以做的就是避免使用MonadFail
实例的 monad(在最近的 GHC 版本中,不完整的绑定模式会导致编译错误)。
这已经有问题了。 还有一个声明为这个解决方案辩护,指出它可能是完全可取的,因此不值得警告:
这实际上是正确的有用行为。 使用诸如
do Just x <- xs Just y <- ys return (x,y)
将做正确的事情,如果 xs 或 ys 结果为 Nothing,则失败。 例如,在列表 monad 中,它将创建两个列表的非 Nothing 成员的叉积。 解析 monad 可能会回溯并尝试另一条路线,IO monad 将创建一个有用的(和确定性/可捕获的)异常,指向模式匹配的确切文件和行号。 do 符号是 haskell 中唯一允许我们以通用方式挂钩语言的模式匹配机制的地方。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.