Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell函数非检验模式在函数误差中的应用_Haskell - Fatal编程技术网

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]
做什么?