|
|
||
二章でレイアウトルールや超基本的な演算に慣れた。三章では、まず型を説明してから、関数型言語の特徴である高階関数と再帰関数の登場。また制御構文(パターンマッチやIF)もここででてくる。
ざっくりまとめてみました(第一部は掘り下げようとすると後の章を読めということになる気がする…)。
トピックを列挙
もろもろちゃんと説明してある。ひととおり読んで、p61の「これまでに紹介した関数の型」をばっと眺めて納得しよう。
以下細かい補足
take :: Int -> [a] -> [a] take :: Int ->([a] -> [a]) -- 括弧を補うとこうなる。 take ::(Int -> [a])-> [a] -- これは間違い
ちなみに、「Haskellの文字は内部的にUnicodeなのに、GHCではエンコーディング変換が未実装」ということが、ここに書いてあった。
map登場。
square n = n * n map :: (a -> b) -> [a] -> [b] map square [1,2,3] --> [1,4,9]という結果になる
tab文字を置き換えるexpandコマンドの実装を、0、1、2とバージョンを上げながら各種構文を説明していく。読みこんだ文字列をmapで変換して出力という流れは全部同じ。以下、それぞれのバージョンの特徴を列挙。
map f [] = [] map f (x:xs) = f x : map f xs
直接再帰を記述するより、map等々の高階関数を使うほうが良いスタイルなので、みんな高階関数使いましょう!というまとめ。
一番良く使うのはmapだろうな。あとはfold系とfilterやiterateがメジャーかな(自信なし)。
--普通版
swapa = do
str <- getContents
putStr $ map swapa' str
swapa' 'a' = 'A'
swapa' 'A' = 'a'
swapa' c = c
-- 短め版
swapa_ = getContents >>= putStr . (map swapa')
where swapa' 'a' = 'A'
swapa' 'A' = 'a'
swapa' c = c