readを作ってみよう

30分プログラム、その419。そういえばshowは結構書いたことあるけど、readは書いたことがなかったことに気がついたので書いてみた。
正直、良くわからなん。どうも中置演算子の優先順位を考慮してreadを書かないといけないっぽいんだけど・・・。まあ、deriving Showすればreadもできるし、それでいいか。

使い方

*Main> Complex (1,2)
1+2i
*Main> read "1+2i" :: Complex
1+2i

ソースコード

import Data.List
import Text.Printf

data Complex = Complex (Int,Int)

instance Show Complex where
    show (Complex (x,y)) = printf "%d+%di" x y

instance Read Complex where
    readsPrec _ r = let (real,_:r')    = break (== '+') r
                        (image,_:rest) = break (== 'i') r'
                    in
                    [(Complex (read real,read image),rest)]