【问题标题】:Why does this code produce a "non-exhaustive patterns in case" error?为什么此代码会产生“非详尽模式以防万一”错误?
【发布时间】:2012-09-21 00:39:17
【问题描述】:

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

我无法理解的是,'c' 和 _ 案件的案件守卫根本不使用on?

我按照给定的here 修改了代码,但是当我运行它时,我得到了错误“Non-exhaustive patterns in case”:

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

为什么会这样?

【问题讨论】:

  • 您能解释一下您认为on 在前两种情况下的作用吗?为什么你认为将它添加到每个案例中是有意义的?
  • 在 StackOverflow 上,最好直接包含代码(缩进四个空格以使其显示为代码),而不是提供指向 hpaste 的链接。

标签: haskell case guard


【解决方案1】:

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

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

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

因此,当on 为False 时,无法选择任何分支,因此您会得到“非详尽模式以防万一”异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2016-03-29
    • 2017-04-23
    相关资源
    最近更新 更多