冗余模式匹配警告

Sau*_*ray 2 haskell pattern-matching

我正在编写一段代码,该代码是一个函数,返回一个像素列表,这是我定义的一种特殊数据类型,其类型如下:

data Pixel = Pixel {
                    color :: Float,
                    elevation :: Float,
                    distance: Float,
                    visited :: Bool
                   } deriving (Show)
Run Code Online (Sandbox Code Playgroud)

我具有要通过两个文件并将它们放到一个像素列表中的功能。这些文件分别包含颜色和高程,因此我继续获取此代码输出:

insertPixels :: [String] -> [String] -> [Pixel]
insertPixels _ _ = []
insertPixels (x:xs) (y:ys) = [Pixel (read x) (read y) 99999999 False] ++ insertPixels xs ys
Run Code Online (Sandbox Code Playgroud)

当我尝试对此进行编译或将其加载到解释器中时,出现以下错误:

lab1.hs:33:1: warning: [-Woverlapping-patterns]
Pattern match is redundant
In an equation for ‘insertPixels’:
    insertPixels (x : xs) (y : ys) = ...
|
| insertPixels (x:xs) (y:ys) = [Pixel (read x) (read y) 99999999 False] ++ insertPixels xs ys
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

我真的不明白这意味着什么或我做错了什么。

Rob*_*ond 5

只需按以下顺序切换2行的顺序即可:

insertPixels :: [String] -> [String] -> [Pixel]
insertPixels (x:xs) (y:ys) = [Pixel (read x) (read y) 99999999 False] ++ insertPixels xs ys
insertPixels _ _ = []
Run Code Online (Sandbox Code Playgroud)

问题是insertPixels _ _所有内容都匹配,并且由于模式是从上至下评估的,因此从第一个匹配处停止,所有可能的输入都将导致列表为空-显然不是您想要的。经过更正后,递归大小写将在两个输入列表均为非空时生效,并且一旦其中一个为空,它将归结为“包罗万象”的情况并导致空列表。

附带说明一下,使用(++)运算符将单个元素添加到列表的开头并不是特别习惯。您可以(:)改为使用(“ cons”)运算符:

insertPixels :: [String] -> [String] -> [Pixel]
insertPixels (x:xs) (y:ys) = (Pixel (read x) (read y) 99999999 False) : insertPixels xs ys
insertPixels _ _ = []
Run Code Online (Sandbox Code Playgroud)