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

时间:2012-09-19 05:05:02

标签: haskell case guard

我正在尝试this tutorial中给出的以下示例。

我无法理解案件'c'_的案件如何不使用on

我将代码修改为给定的here,但是当我运行它时,我收到错误“非详尽的模式”:

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

为什么会这样?

1 个答案:

答案 0 :(得分:6)

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

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

case x of
   'a' | on -> ...
   'b' | on -> ...
   'c' | on -> ...
   _   | on -> ...

因此,当onFalse时,不能选择任何分支,因此您会得到“非详尽无遗的模式”异常。