ふつける:9章読んだ
9章は,「型と型クラス」.今まで何も知らずに,(Ord a) => とかしてた謎が解けた.凄いよ,型クラス便利くせぇ.それでは,練習問題を解きます.
Int型フィールドとString型フィールドをこの順番で持つ新しい型を定義
名前は,Lineで.dataを使えって事でしょうか.
data Line = Line Int String
Line型の値を作ってprint関数で表示
deriving Showを付けておく必要がある,ってこれヒントじゃん.
data Line = Line Int String deriving Show l :: Line l = Line 4 "Revoltech" main = print l => $ ./data Line 4 "Revoltech"
ホントになんでもshowするんだな.
Line型のフィールドにフィールドラベルを付けれ
data Line = Line { number :: Int, string :: String } deriving Show l :: Line l = Line { string = "Revoltech", number = 4} main = print l => $ ./data Line {number = 4, string = "Revoltech"}
わざとnumberとstringを逆に書いても,ちゃんと入ってますね.ホント構造体みたいだ.
Line型の値のリストを作るってprint
せっかくなんで,Line -> Revoにします.次はソートなんで,順番は適当.
data Revo = Revo { number :: Int, string :: String } deriving Show r :: [Revo] r = [ Revo {number = 8, string = "Getter2"}, Revo {number = 4, string = "Evangelion 1st"}, Revo {number = 2, string = "Dougram"}, Revo {number = 7, string = "King-Gainer"}, Revo {number = 3, string = "Dante"}, Revo {number = 9, string = "Evangelion 3rd"}, Revo {number = 1, string = "Getter1"}, Revo {number = 5, string = "Evangelion Zero"}, Revo {number = 6, string = "Evangelion 2nd"} ] main = print r
壮観だ.
ちょ,海洋堂のリボルテックラインナップ,EvangerionになってるYO!天使が怒ってどーする.
Line型のリストを行番号でソートするsortListを書け
List.sortBy,とOrdクラスのcompareを使えとの事.ボクの場合は,sortRevoですね.
こんなかんじかなん.
main = do putStr $ concatMap revo2str $ sortRevo r revo2str :: Revo -> String revo2str (Revo {number = n, string = s}) = "Series No." ++ (show n) ++ "\t" ++ s ++"\n" sortRevo :: [Revo] -> [Revo] sortRevo = sortBy (\(Revo {number = x}) (Revo {number = y}) -> x `compare` y)
sortRevoえぐい.しかし,「大体こんな感じかな?」って書いてコンパイル通るのが素敵すぎる.
実行結果です.
$ ./data Series No.1 Getter1 Series No.2 Dougram Series No.3 Dante Series No.4 Evangelion 1st Series No.5 Evangelion Zero Series No.6 Evangelion 2nd Series No.7 King-Gainer Series No.8 Getter2 Series No.9 Evangelion 3rd
凄いよ,リボルテックのシリーズラインナップがソートされたよ.それじゃ,比較するのをnumberではなくてstringにしてみよう.
$ ./data Series No.3 Dante Series No.2 Dougram Series No.4 Evangelion 1st Series No.6 Evangelion 2nd Series No.9 Evangelion 3rd Series No.5 Evangelion Zero Series No.1 Getter1 Series No.8 Getter2 Series No.7 King-Gainer
やったー,ちゃんとできた.これは,OrdクラスにStringが定義されているお陰なんですね.