関数型プログラミングと 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
- 最初の行は「magicNumber」を保持します。ここで、P2 は 8 ビット グレー イメージを表します。
- 2行目はコメントです
- 3 行目は、イメージの幅と高さがスペースで区切られています。
- 4行目は最大グレー値です
- ここからファイルの最後までは、各ピクセルのグレー値です
この pgm ファイルをデータ構造 (ASCIIGreymap) に解析して、後で 2 つの画像を比較したいと思います。しかし、私が言ったように、私はそこに着く方法がわかりません。私のアプローチが間違っている場合、または pgm イメージを解析するより良い方法がある場合は、お知らせください。
どんな助けでも大歓迎です!
編集:pgmファイルの解析が進んでいないので、私のアプローチが正しいかどうかはもうわかりません。
ファイルの内容を取得し、それをデータ構造に入れてさらにデータを操作するという私の一般的なアイデアについて、誰かコメントしてもらえますか? それとももっと良い方法がありますか?
再度、感謝します!