仲間うちでこの本で読書会しましょうという話がありました。
一ヶ月くらい前にあったわりには読書会の話は進んでなくて、じゃー読書会までは待機モードかなってかわいく思いつつ情報収集してたら、どうやら各自が勝手に勉強しているという抜け駆けに近い状況らしい。「kiririmode はかなり先に進んでるだろうって話してた」というような話も漏れ聞こえ、ヤバい 1 ページも読んでねーぞっていうぼくは懸命に Haskell に入門することにしたのでした。
言語全体については、型推論はもちろん、文法含めて ML に非常に良く似ているなっていう印象を受けました。というよりは、年代を考えると ML の子孫に Haskell があるんだと思います。
4 章までさらっと読んで、練習問題をやってみた。
練習問題
下記の問題文は本文とはずいぶん違います。
1. 偶数の長さを持つリストを半分ずつに分割する関数 halve を定義せよ。
halve :: [a] -> ([a], [a]) halve xs = ( take (length xs `div` 2) xs, drop (length xs `div` 2) xs)
2. ライブラリ関数 tail のように振る舞い、空リストに関しては空リストを返す safetail を以下を用いて定義せよ
a. 条件式
b. ガードつきの等式
c. パターンマッチ
safetailA :: [a] -> [a] safetailA xs = if null xs then [] else tail xs safetailB :: [a] -> [a] safetailB xs | null xs = [] | otherwise = tail xs safetailC :: [a] -> [a] safetailC [] = [] safetailC xs = tail xs
3. パターンマッチを用いて論理和演算子 || を定義せよ
(||) :: Bool -> Bool -> Bool False || False = False _ || _ = True
4. 条件式を用いて論理積演算子 && を定義せよ
(&&) :: Bool -> Bool -> Bool (&&) a b = if a then if b then True else False else False
6. カリー化された関数 mult x y z = x * y * z をλ式を用いて表現せよ
mult :: (Num a) => a -> a -> a -> a mult = \x -> (\y -> (\z -> x * y * z))