「ふつける」勉強会 資料用 このページをアンテナに追加 RSSフィード

 | 

2006-06-12

ふつける勉強会 第二回目 第三章 「型と高階関数」 (終了) ふつける勉強会 第二回目 第三章 「型と高階関数」 (終了) - 「ふつける」勉強会 資料用 を含むブックマーク はてなブックマーク - ふつける勉強会 第二回目 第三章 「型と高階関数」 (終了) - 「ふつける」勉強会 資料用 ふつける勉強会 第二回目 第三章 「型と高階関数」 (終了) - 「ふつける」勉強会 資料用 のブックマークコメント

二章でレイアウトルールや超基本的な演算に慣れた。三章では、まず型を説明してから、関数型言語の特徴である高階関数再帰関数の登場。また制御構文(パターンマッチやIF)もここででてくる。

ざっくりまとめてみました(第一部は掘り下げようとすると後の章を読めということになる気がする…)。

トピックを列挙

もろもろちゃんと説明してある。ひととおり読んで、p61の「これまでに紹介した関数の型」をばっと眺めて納得しよう。

以下細かい補足

  • printの型のうち"(Show a)=>"は型クラスによる制約。9章で詳しく紹介される。
  • IO ()はいままで「アクション」と呼ばれていたものの型。IOモナド
  • 関数の型の結合の方向には注意。
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]という結果になる

expand.hs

tab文字を置き換えるexpandコマンドの実装を、0、1、2とバージョンを上げながら各種構文を説明していく。読みこんだ文字列をmapで変換して出力という流れは全部同じ。以下、それぞれのバージョンの特徴を列挙。

最後にmapの定義を解説しつつ再帰のおさらい

mapの定義と、いわゆるconsセル概念説明。

map f [] = []
map f (x:xs) = f x : map f xs
  • リストへのパターンマッチが使われている。いわゆるcarとcdrにマッチ
  • (x:xs)は()つけないとパースエラーになるので注意
  • ":"は演算子。cons。
  • mapの処理の順序も説明されているが、ややごまかしがあるような(4段目で左から実行されるのは何故?)。正確な説明は5章かな。

直接再帰記述するより、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

この章と関係ないけど補足

次回

 |