Haskell函数非检验模式在函数误差中的应用
我试图创建一个函数,在列表中查找本地最大数Haskell函数非检验模式在函数误差中的应用,haskell,Haskell,我试图创建一个函数,在列表中查找本地最大数 localMaxima :: [Integer] -> [Integer] localMaxima [] = [] localMaxima [x] = [] localMaxima (e1:e2:e3:xs) | (e2 > e3) && (e2 > e1) = e2 : (localMaxima (e2:(e3:xs))) | otherwise = (localMaxima (e2:(e
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问题中的非穷举模式
从错误中可以看出,模式匹配并没有覆盖所有情况:如果给它一个包含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 _ = []
我看这里没有问题。您希望
localMaxima[1,2]
做什么?