我正在尝试创建一个在列表中找到本地最大数字的函数。
localMaxima :: [Integer] -> [Integer]
localMaxima [] = []
localMaxima [x] = []
localMaxima (e1:e2:e3:xs)
| (e2 > e3) && (e2 > e1) = e2 : (localMaxima (e2:(e3:xs)))
| otherwise = (localMaxima (e2:(e3:xs)))
输入[2,3,4,1,5]的列表后,控制台输出:
函数localMaxima中的非穷举模式
答案 0 :(得分:0)
从错误中可以看出,模式匹配不能涵盖所有情况:如果给它一个包含2个元素的列表会怎样? e1:e2:[]
与您的任何情况都不匹配,从而导致非穷尽的模式错误。
解决方案非常简单:为仅包含两个元素的列表添加一个基本案例。假设边界上的点不能为局部最小值/最大值,则函数应如下所示。
localMaxima :: [Integer] -> [Integer]
localMaxima [] = []
localMaxima [x] = []
localMaxima [a,b] = []
localMaxima (e1:e2:e3:xs)
| (e2 > e3) && (e2 > e1) = e2 : (localMaxima (e2:(e3:xs)))
| otherwise = (localMaxima (e2:(e3:xs)))
此外,您可以通过以下方式进一步简化此操作
:
是右关联的_
您现在可以拥有
localMaxima :: Ord a => [a] -> [a]
localMaxima (e1:e2:e3:xs)
| (e2 > e3) && (e2 > e1) = e2 : localMaxima (e2:e3:xs)
| otherwise = localMaxima (e2:e3:xs)
localMaxima _ = []