我对函数式编程和Haskell完全陌生,我需要将ASCII PGM图像解析为数据结构,但我无法弄清楚如何做到这一点。
我看了很多例子(包括Graphics.Pgm模块),但仍然不知道如何在Haskell中编写它。这是我到目前为止(此代码不编译):
import System.IO
import Control.Monad
import Control.Applicative
import Data.Attoparsec.Char8
import qualified Data.ByteString as B
data ASCIIGreymap = ASCIIGreymap {
aGreyType :: String
, aGreyComment :: String
, aGreyWidth :: Int
, aGreyHeight :: Int
, aGreyMax :: Int
, aGreyData :: [Int]
} deriving (Eq)
instance Show ASCIIGreymap where
show ( ASCIIGreymap t c w h m _ ) = "ASCIIGreymap Type: "++show t ++ "Comment: " ++ show c ++ " w: " ++ show w ++ " h: " ++ show h ++ " max: " ++ show m
parseASCIIGreymap :: Parser ASCIIGreymap
parseASCIIGreymap = do
pgmType <- string
pgmComment <- string
pgmWidth <- integer
char ' '
pgmHeight <- integer
pgmMax <- integer
pgmGreyData <- [integer]
return $ ASCIIGreymap pgmType pgmComment pgmWidth pgmHeight pgmMax pgmGreyData
pgmFile :: FilePath
pgmFile = "test_ascii.pgm"
main = B.readFile logFile >>= print . parseOnly parseASCIIGreymap
示例文件(test_ascii.pgm)如下所示:
P2
# CREATOR: GIMP PNM Filter Version 1.1
10 10
255
0
0
0
0
0
64
255
255
255
179
0
0
0
0
0
159
255
255
255
243
0
0
0
0
96
223
255
255
255
255
0
0
64
96
223
255
255
255
255
255
128
128
191
223
255
255
255
255
255
255
255
255
255
255
255
249
217
179
128
128
255
255
255
255
249
198
89
51
0
0
255
255
255
249
198
77
0
0
0
0
255
255
255
236
128
0
0
0
0
0
191
255
255
218
51
0
0
0
0
0
我想将这个pgm文件解析为数据结构(ASCIIGreymap),以便稍后比较两个图像。但就像我说我不知道如何到达那里。如果我的方法有误或者有更好的方法来解析pgm图像,请告诉我。
非常感谢任何帮助!
编辑:由于我在解析pgm文件方面没有取得任何进展,如果我的方法是正确的,我不再确定。 有人可以评论我的一般想法,即获取文件的内容并将其放入数据结构中以进一步处理数据吗?或者有更好的方法吗?
再次感谢!