如何使用Haskell解析数据结构中的ASCII PGM文件?

时间:2015-06-09 23:35:47

标签: parsing haskell data-structures ascii pgm

我对函数式编程和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
  1. 第一行包含&#34; magicNumber&#34;其中P2代表8位灰色 图像
  2. 第二行是评论
  3. 第三行的图像宽度和高度分开 一个空间
  4. 第四行是最大灰度值
  5. 从这里到文件的末尾是每个的灰色值 像素
  6. 我想将这个pgm文件解析为数据结构(ASCIIGreymap),以便稍后比较两个图像。但就像我说我不知道​​如何到达那里。如果我的方法有误或者有更好的方法来解析pgm图像,请告诉我。

    非常感谢任何帮助!

    编辑:由于我在解析pgm文件方面没有取得任何进展,如果我的方法是正确的,我不再确定。 有人可以评论我的一般想法,即获取文件的内容并将其放入数据结构中以进一步处理数据吗?或者有更好的方法吗?

    再次感谢!

0 个答案:

没有答案