我有以下功能:
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
的空列表参数?
答案 0 :(得分:10)
这不是关于你的功能。它是关于范围表示法的。在ghci中输入[5..1]
,您就会发现您获得了一个空列表。
Haskell范围表示法默认在每个步骤添加一个,除非您使用[first,second..last]
表示法明确更改它。使用[5,4..1]
来获取您正在寻找的行为。
如果删除函数的第一个版本,则该模式并非详尽无遗,因为您的函数版本无法与空列表匹配。