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

Parsing 如何用Haskell解析数据结构中的ASCII PGM文件?,parsing,haskell,data-structures,ascii,pgm,Parsing,Haskell,Data Structures,Ascii,Pgm,我对函数式编程和Haskell是完全陌生的,我需要将ASCII PGM图像解析为数据结构,但我不知道如何做到这一点 我已经看过很多例子(包括Graphics.Pgm模块),但仍然不知道如何用Haskell编写它。以下是我到目前为止所做的(此代码未编译): 第一行包含“magicNumber”,其中P2代表8位灰色 形象 第二行是评论 第三行用分隔符分隔图像的宽度和高度 空间 第四行是最大灰度值 从这里开始到文件的末尾是每种颜色的灰色值 象素 我想将这个pgm文件解析为数据结构(ascigreym

我对函数式编程和Haskell是完全陌生的,我需要将ASCII PGM图像解析为数据结构,但我不知道如何做到这一点

我已经看过很多例子(包括Graphics.Pgm模块),但仍然不知道如何用Haskell编写它。以下是我到目前为止所做的(此代码未编译):

  • 第一行包含“magicNumber”,其中P2代表8位灰色 形象
  • 第二行是评论
  • 第三行用分隔符分隔图像的宽度和高度 空间
  • 第四行是最大灰度值
  • 从这里开始到文件的末尾是每种颜色的灰色值 象素
  • 我想将这个pgm文件解析为数据结构(ascigreymap),以便稍后比较两个图像。但就像我说的,我不知道怎么去那里。如果我的方法是错误的,或者如果有更好的方法解析pgm图像,请让我知道

    非常感谢您的帮助


    编辑:由于我在解析pgm文件方面没有取得任何进展,因此我不再确定我的方法是否正确。
    有人能评论一下我的想法吗?我想把文件的内容放在一个数据结构中,以便进一步处理数据?还是有更好的办法


    再次感谢

    《真实世界哈斯克尔》一书中有一个可能对你有用的例子:@danplubell谢谢你的链接。我已经看过这个例子了。本书中的示例代码适用于原始pgm图像,但可以进行增强以读取ascii pgm(注释中有一些与解决方案相关的链接)。我的问题是他们不解析注释。我不知道该怎么补充。所以我认为逐行解决方案更容易实现。
    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
    
    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