为什么此代码会产生"非详尽的模式以防万一"错误?

use*_*560 1 haskell case guard

我正在尝试本教程中给出的以下示例.

我无法理解的是案件是如何保护案件'c'_根本不使用的on

我修改了这里给出的代码,但是当我运行它时,我得到错误"非详尽的模式以防万一":

*StateGame> main "accaaaa"
*** Exception: state1.hs:(27,5)-(31,36): Non-exhaustive patterns in case
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

ham*_*mar 6

案例保护是一个布尔表达式,在成功匹配相应的模式后进行检查.如果评估为True,则选择该分支.否则,Haskell将继续从上到下尝试每个案例.

在您的示例中,所有案例都具有保护表达式on:

case x of
   'a' | on -> ...
   'b' | on -> ...
   'c' | on -> ...
   _   | on -> ...
Run Code Online (Sandbox Code Playgroud)

因此,当onFalse,没有一个分支可以选择,所以你得到一个"的情况下,非详尽模式"的异常.