Haskell函数的非错误模式在函数错误中

时间:2019-04-08 23:09:37

标签: haskell

我正在尝试创建一个在列表中找到本地最大数字的函数。

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中的非穷举模式

1 个答案:

答案 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 _ = []