0

宿題をしていて、エラーが発生しました

今説明したデータ型に関する関数を実行する必要があります

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

たとえば、関数を実行しようとすると

negative :: PBMfile -> [Int] 
negative PBM x y z = [1,2,3]

ハグエラー

ERROR file:.\haha.hs:32 - Constructor "PBM" must have exactly 3 arguments in pattern

しかし、PBM xyz は 3 つの引数ではありませんか? 私は何を間違っていますか?

4

2 に答える 2

2

関数定義negative PBM x y zは、4つの引数に対してパターンマッチングを試みています。最初の引数は、PBMデータコンストラクターです。データコンストラクタとその引数を実際にパターンマッチングするには、それらをグループ化する必要がありますnegative (PBM x y z) = ...。あなたの質問のshow定義はそれを正しく行う例です。

詳細については、http://en.wikibooks.org/wiki/Haskell/Pattern_matching#The_connection_with_constructorsをお試しください。

于 2012-05-01T21:27:56.667 に答える
1

括弧が必要です。

negative :: PBMfile -> [Int] 
negative (PBM x y z) = [1,2,3]

それ以外の場合は、 への 4 つの引数として解析されますnegative

于 2012-05-01T21:20:09.333 に答える