【问题标题】:Non-exhaustive patterns using if-then-else使用 if-then-else 的非穷举模式
【发布时间】:2023-04-10 18:17:01
【问题描述】:

我有以下功能:

myMaximum [] = error "There is no such thing as 'maximum' in an empty list."
myMaximum [x] = x
myMaximum (x:xs) = if x >= tailMax
                    then x
                    else tailMax
                where tailMax = myMaximum xs

当我运行myMaximum [1..5] 时我工作得很好,但是当我运行myMaximum [5..1] 时它会抛出第一行定义的错误。如果我取出第一行,它会抱怨myMaximum 上存在非详尽的模式。但为什么这种模式不是详尽无遗的呢?以及如何使用[1..5] 调用它工作得很好并且[5..1] 显然会导致myMaximum 的空列表参数?

【问题讨论】:

  • 顺便说一句,你应该把你的错误信息改成"[name]: [cause]"的标准格式,所以应该是error "myMaximum: empty list"
  • @AJFarmar 感谢您的提示!

标签: haskell functional-programming pattern-matching


【解决方案1】:

这与您的职能无关。这是关于范围符号的。在 ghci 中输入[5..1],你会发现你得到了一个空列表。

Haskell 范围表示法默认在每一步添加一个,除非您使用 [first,second..last] 表示法明确更改它。使用[5,4..1] 获取您正在寻找的行为。

如果您删除函数的第一个版本,则该模式并非详尽无遗,因为此时没有任何版本的函数可以匹配空列表。

【讨论】:

    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多