繁体   English   中英

如何让 GHC 警告 do 块中不完整的模式绑定?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM