Parsing 如何用Haskell解析数据结构中的ASCII PGM文件?
我对函数式编程和Haskell是完全陌生的,我需要将ASCII PGM图像解析为数据结构,但我不知道如何做到这一点 我已经看过很多例子(包括Graphics.Pgm模块),但仍然不知道如何用Haskell编写它。以下是我到目前为止所做的(此代码未编译):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
编辑:由于我在解析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