Hatena::Grouphaskell

Haskellで遊ぶよ

 | 

2009-08-18

JPEG判定

04:49

これを見てて、Haskell だとどうなるんだろうなー、と思って色々調べながらコネコネしてみた。


import Char
import System
import System.IO

checkSOI (x:[]) = False
checkSOI (x:x':_) = x == 0xFF && x' == 0xD8

checkEOI (x:[]) = False
checkEOI xs = checkEOI' $ reverse xs
    where
        checkEOI' (x:x':_) = x == 0xD9 && x' == 0xFF

jpgCheck xs = checkSOI xs && checkEOI xs

main = do
        args <- getArgs
        if null args
            then putStrLn "Error! Usage : jpgCheck filename"
            else do
                h <- openBinaryFile (head args) ReadMode
                cs <- hGetContents h
                print $ jpgCheck $ map ord cs

使い方。

% runghc jpgCheck.hs image.jpg
True
% runghc jpgCheck.hs text.txt
False

バイナリファイルを開くのは import System.IO して openBinaryFile path ReadMode

Linux などでは openFile と同じらしい。たぶん OS X も。


map ord を使うのが良い方法な気がしない。ByteString とか Word8 も調べたんだけど、使い方がよくわからなかった…

突っ込み歓迎。


上の記事の続き

01:08

なるほど。ByteString はこう使うのか。

hGetContents を override して、IO String ではなくて IO ByteString を返すようにするわけですね。ここの部分がよくわからなかったので前は諦めた。

bracket も新鮮。try-finally だそうな。

System.Environment というのの中に getProgName というのもあるのね。それを使って書けばよかった。

eagletmteagletmt2009/08/20 09:28override というよりは,hGetContents :: Handle -> IO ByteString のみをインポートするかんじですね.
hGetContents :: Handle -> IO String は Prelude にはないので,明示的にインポートしなければ使えません.
プログラム中で両方使いたい場合は,例えば
import System.IO
import qualified Data.ByteString as B
などとして,hGetContents :: Handle -> IO String, B.hGetContents :: Handle -> IO ByteString のように使い分けられます.

edvakfedvakf2009/08/20 09:54丁寧にありがとうございます。
qualified とか as の意味もよくわかっていませんでしたが、たぶんわかったと思います。

トラックバック - http://haskell.g.hatena.ne.jp/edvakf/20090818
 |