ふつける: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が定義されているお陰なんですね.