问题 Haskell - haskell中的非详尽模式匹配


所以我正在学习Haskell并且想写一个简单的代码,它只是在字符串中重复两个字母。所以我想出了这个:

repl :: String->String
repl " " = " "
repl (x:xs) = x:x:repl xs

现在编译时我没有收到任何警告,但是当我这样做时发生了运行时错误 repl "abcd" :

"abcd*** Exception: repl.hs:(2,1)-(3,23): Non-exhaustive patterns in function repl

那么为什么编译器从未报告过这个问题,为什么在有很多像OCaml这样的语言在编译时会清楚地报告这个问题时Haskell会忽略它呢?


9372
2017-08-06 21:48


起源

ghc -fwarn-incomplete-patterns 似乎合适...... - recursion.ninja
如果用-Wall编译它应该发出警告。具体来说,标志-fwarn-incomplete-patterns检查此 - Silvio Mayolo


答案:


默认情况下,模式匹配警告处于关闭状态。你可以用它打开它 -fwarn-incomplete-patterns 或作为一大堆警告的一部分 -W 和 -Wall

你可以这样做 ghci

Prelude> :set -W

你也可以将旗帜传递给 ghc 当您编译或将其作为编译指示包含在模块顶部时:

{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}

对于您的特定程序,它应该给出以下警告:

/home/tjelvis/Documents/so/incomplete-patterns.hs:2:1: Warning:
    Pattern match(es) are non-exhaustive
    In an equation for ‘repl’: Patterns not matched: []

9
2017-08-06 21:50



好的,你能告诉我在上面代码中错过了哪些模式吗? - Crazy Psychild
“”是一个包含一个空格的字符串。 []是空列表,也是空字符串。你也可以写“”,没有空格。 - Silvio Mayolo
@AbhinavJain:你错过了空字符串。 (" " 是具有单个空格字符的字符串。) - Tikhon Jelvis
@AbhinavJain:编译器会告诉您是否打开此警告并编译代码。 - Tikhon Jelvis
@TikhonJelvis是的,我刚看到它。 - Crazy Psychild