(Haskell上的RGBData)模式匹配失败

时间:2014-12-04 01:01:20

标签: haskell pattern-matching rgb

即时通讯使用Haskell,我正在做一个proyect,我对数据类型有些怀疑。

我正在使用PBM文件并使用此数据类型

data RGBdata= RGB Int Int Int
data PBMfile= PBM Int Int [[RGBdata]]

也是老师给我们的代码

instance Show RGBdata where
show (RGB r g b)=(show r)++" "++(show g)++" "++(show b)
instance Show PBMfile where
show (PBM width height l)= "P3\n"++(show width)++" "++(show height)++"\n255\n"++(foldr    (++) "" (map myshow l))
myshow [] = "\n"
myshow (h:t) = (show h)++" "++(myshow t)
cargarPBM name = readFile name >>= return . rLines . lines 
rLines (_:x:_:xs)= (\[a,b] -> (PBM (read a) (read b) (rLines' (read a) (concat $map     words xs)))) $ words x
rLines' _ [] = []
rLines' a x = (rLine (take (a*3) x): rLines' a (drop (a*3) x))
rLine []= []
rLine (r:g:b:xs)= ((RGB (read r) (read g) (read b)):rLine xs)
aplicar funcion origen destino= cargarPBM origen >>= writeFile destino . show . funcion

然后我需要用PBM文件做一些函数,比如将它转换为负数,旋转它等等。 我开始使PBM为负,转换为负值为(RGB 255-R 255-G 255-B)

我做了一个使PBM文件为负的函数!这是我做的代码..

negativo :: PBMfile -> PBMfile
negativo (PBM i j mtx) = (PBM i j (aplicar_negativo 0 (i*j) mtx)) 

aplicar_negativo :: Int -> Int -> [[RGBdata]] -> [[RGBdata]]
aplicar_negativo a n (x:xs) | ((a+2)==n) = (aplicar_negativo2 [x])++(aplicar_negativo2 xs)
                        | otherwise = (aplicar_negativo2 [x])++(aplicar_negativo (a+1) n xs)

aplicar_negativo2 :: [[RGBdata]] -> [[RGBdata]]
aplicar_negativo2 [[RGB x y z]] = ([[RGB (255-x) (255-y) (255-z)]])

这3个函数只是将所有rgbdatas更改为255-r,255-g和255-b .. 即如果我有我的列表[[RGB 100 200 100],[RGB 50 55 50]] 结果是:[[RGB 155 55 155],[RGB 205,200,205]]

以下是我在图片上应用功能negativo时出现的错误:

Program error: pattern match failure: aplicar_negativo2 [[RGB (read (_SEL (,) 
("6" ++ _SEL (,) ("5" ++ _SEL (,) ([],[]) 1,[]) 1,[]) 1)) (read (_SEL (,) ("1"
++ _SEL (,) ("2" ++ _SEL (,) ("6" ++ _SEL (,) ([],[]) 1,[]) 1,[]) 1,[]) 1)) 
(read (_SEL (,) ("7" ++ _SEL (,) ("1" ++ _SEL (,) ([],[]) 1,[]) 1,[]) 1)),RGB 
(read (_SEL (,) ("5" ++ _SEL (,) ("2" ++ _SEL (,) ([],[]) 1,[]) 1,[]) 1)) (read
(_SEL (,) ("1" ++ _SEL (,) ("1" ++ _SEL (,) ("2" ++ _SEL (,) ([],[]) 1,[]) 1,[])
1,[]) 1)) (read (_SEL (,) (words_v858 (break isSpace "5" ++ _SEL (,) (span_v848 
(span (not . primEqChar '\n') (_hreader {handle}))) 1)) 1))] ++ rLine (take 
(700 - 1) (words (_SEL (,) (words_v858 (break isSpace "5" ++ _SEL (,) (span_v848 
(span (not . primEqChar '\n') (_hreader {handle}))) 1)) 2) ++ foldr (++) [] 
(map_v810 words (lines_v853 (_SEL (,) ("5" ++ _SEL (,) (span_v848 (span (not .
primEqChar '\n') (_hreader {handle}))) 1,_SEL (,) (span_v848 (span (not . 
primEqChar '\n') (_hreader {handle}))) 2) 2)))))]

请原谅我的英语不好,谢谢!

1 个答案:

答案 0 :(得分:1)

以下功能:

aplicar_negativo2 :: [[RGBdata]] -> [[RGBdata]]
aplicar_negativo2 [[RGB x y z]] = ([[RGB (255-x) (255-y) (255-z)]])

仅匹配列表中的单个RGB数据项目....

然而,在查看错误消息后(......这并不容易,相信我),我能够看到你用这种形式调用了这个函数

[[RGB _ _ _,RGB _ _ _] ++ <more stuff>]

所以你把内部列表中至少有两个元素的东西传递给一个只占用该列表中一个元素的函数。

我的猜测是你意味着aplicar_negativo2中的逻辑应用于内部的所有元素....你可以通过定义应用于一个元素的函数,然后在外面使用map来实现这一点(在哪里使用它。)