簡體   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