使用if-then-else

时间:2015-10-14 12:52:26

标签: 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

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

1 个答案:

答案 0 :(得分:10)

这不是关于你的功能。它是关于范围表示法的。在ghci中输入[5..1],您就会发现您获得了一个空列表。

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

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