使用if-then-else的非详尽模式

Met*_*der 2 haskell functional-programming pattern-matching

我有以下功能:

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
Run Code Online (Sandbox Code Playgroud)

我跑的时候工作得很好myMaximum [1..5],但是当我跑的时候它会抛出第一行定义的错误myMaximum [5..1].如果我把第一行拿出来,它会抱怨有一个非详尽的模式myMaximum.但为什么这种模式并非详尽无遗呢?如何调用它[1..5]工作得很好,[5..1]显然导致空列表参数myMaximum

Seb*_*edl 10

这不是关于你的功能.这是关于范围表示法.键入[5..1]在ghci中,你会发现,你得到一个空列表.

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

如果删除函数的第一个版本,则该模式并非详尽无遗,因为您的函数版本无法与空列表匹配.