今回で全部読み終わる予定だったけど、大幅寝坊で1時間遅刻。最後の部分はすでに読み終わって、質疑をしているところだった。作った関数がモナド則を満たしているかを証明、みたいな議論をしていたようだ。
最初は何の話をしているのか理解しようとしたものの、途中で諦めて自分で該当部分を読むことにした。残念ながら時間切れで全部は読めなかったので、ここは自分で復習が必要。この本、最後だけ急に難易度が高いから理解しきれんかも。
で、後半はA Gentle Introduction to Haskell, Version98を読んでいった。実は告知ページ斜め読みしてて理解してなかった (ネタ変えて続くんだー、程度の認識) んだけど、そこは「持っててよかった emacs + w3m + eblook」。
なにしろ英語なので「1 人 1 パラグラフずつ音読してから、各人の理解を言いあう」みたいな感じに進め方は変更された。英文をみんなで読む時は音読するのが良いらしい。確かに、記号とか難読単語のオレオレ読みが防げたりして結構よさげな感じ。
タイトルと違ってまったく gentle じゃないんだけど、扱っている内容自体は「ふつうの Haskell」+αくらいらしい。モナドの全てを事前に読んでおくとαの部分が理解しやすいとのこと。
以下、読んだところのメモ。
2Values, Types, and Other Goodies
- value は全て first-class
- つまり、引数として関数に渡したり、結果として返されたり、データ構造に埋めこんだりできる
- type は first-class ではない
- value を説明するもの
- type と value の関連づけを typing と呼ぶ
- 関数は「=」で宣言する
- type は「::」で宣言する
- static type イイヨイイヨー
- type をとり違うことがない
- コンパイル時にエラーを拾える
- コンパイラが効率的なコードを吐ける
- type 推論が超強力
- でもドキュメンテーションとして明示的に type 宣言するのがおすすめ
2.1 Polymorrphic types
- universally quantified 「任意の」
- haskell の type variable は全て universally quantified
- 特定の type と区別するために小文字で書く
- 「[Int] → (Int 型の) 値のリスト」
- 「[a] → (任意の型 a の) 値のリスト」
- 「[Int] → (Int 型の) 値のリスト」
- パターンマッチは直感的
- polymorphic type における一般化の順序の話
- うまく型付けされていれば、principal type を持つことが保証される
- principal type は自動推論される
- principal type → その型に含まれるインスタンスを過不足なく一般的に表現した型
- head の例: principal type は [a]->a
- [b]->a とか a->a とか a もあてはまるけど広すぎる
- [Integer]->Integer もあてはまるけど狭すぎる
- [b]->a とか a->a とか a もあてはまるけど広すぎる
- principal type があるのは、[http://d.hatena.ne.jp/wasisan/20080309/p4:title=Hindley-Milner 型システム]の売り
- うまく型付けされていれば、principal type を持つことが保証される