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)
我真的不明白这意味着什么或我做错了什么。
只需按以下顺序切换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)