【问题标题】:Non-exhaustive patterns in function len函数 len 中的非详尽模式
【发布时间】:2021-04-18 05:05:36
【问题描述】:

我正在编写这个函数 len,它计算 GHCi 中列表的长度。

len [] = 0
len [x] = 1
len (x:xs) = 1 + len xs

我试图以[] 作为参数调用该函数,但错误Exception: Non-exhaustive patterns in function len 击中了我。我不是已经在函数定义中包含了空列表案例吗?

【问题讨论】:

  • GHCi 中的多行定义为tricky to enter。如果您将代码编写在 .hs 文件中,然后在 GHCi 中编写 :load 会更容易。在您的情况下,最后一行被解释为覆盖前一行的定义,有效地忽略了前两行,因此出现错误。
  • 顺便说一句,您不需要单例列表案例(您的中间线),因为它被一般的非空列表案例(底线)覆盖(具有相同的结果)。具体来说,[x]x : [] 的语法糖
  • 这能回答你的问题吗? Non exhaustive pattern in function in GHCi

标签: haskell read-eval-print-loop ghci non-exhaustive-patterns multiline-repl-definition


【解决方案1】:

扩展 Paul 的答案,您还可以使用 :{, :} 在 ghci 中编写多行定义

例如。

:{
len [] = 0
len (x:xs) = 1 + len xs
:}

【讨论】:

  • 这确实是可能的(+1),但我建议永远不要这样做。多行并没有真正给你买任何东西,无论是编辑还是阅读(这无论如何都不是 REPL 的重点)。任何不容易放在一行中的东西通常最好放在一个文件中。实际上,我有时会在 GHCi 中编写很长的命令,但仍然喜欢将它们留在一行中(即使该行需要被终端中断),因为这允许使用向上箭头重复/编辑整个内容,而多行定义要求您独立检索每一行 - 超级尴尬。
【解决方案2】:

正如 chi 在评论中所说,GHCi 不是那样工作的。

您可以使用分号在 GHCi 中输入多部分定义,如下所示:

len [ ] = 0 ;长度 (x:xs) = 1 + 长度 xs

(单项列表的情况由第二部分处理,因为[x] == x : []

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多