- http://atnd.org/events/20095
- ニフティ セミナールーム / 大森ベルポートA館 6F
あわてて家を出たので名札ケースと電源タップをもって出るのを忘れてしまった。しかたがないので会社に寄ってタップを調達した。
社員のかたの誘導で部屋まで移動するがエレベータに乗りきれず下で待つも来ず。セミナールームが何階かわからないのでエレベータホールで待機してたら第2陣が来て同乗。
関数プログラミングの道しるべ / @kazu_yamamoto
http://www.mew.org/~kazu/material/2011-fp.pdf
- 関数プログラミングのつどいの資料
- 今回のスタートhaskell参加者のうち半数ほどがそのイベントにも参加していた (挙手しらべ)
- 関数型の手法とは、永続データをつかったプログラミング。
- 永続データプログラミング
- for文はぶかっこうなのか?
- 関数型プログラマからすると長いし仕事をしすぎている。
- reduceはcommon lisp用語、ほかではfoldという。
- SICPは修行のような本。
- リスト
- 配列だとコピーが。
- パターンマッチがあるのでhead/tailはあまりつかわないし、空リストでエラーになるのでつかわないほうがいい。
- ++は右結合でつかえ。
- Q: 正しく動くのはわかっても効率がいいのかがわからない。
- A: まとまった文書はないが、あちこちにちらばっている。差分リストという考え方があってRealWorldHaskellとかをよむとわかる。
- 再帰
- 「一つまえができていたら、次はどうする?」(C)nobsun
- 二種類の再帰
- リストを生成する関数 → ふつうの再帰(しぜんな再帰) → こっちのほうが力がある(両替もんだいとか)、遅延評価と相性がよい
- 数値を生成する関数 → 末尾再帰をつかう → 再帰でループをエミュレートする
- (++)とか遅延評価があるのでスタックを消費しないらしい。
- Q: reverse_appendみたいなのはダメじゃん。
- A: map g . map f → map (g.f) に書き換えられたりする。融合変換。優良生産者・優良消費者という考えかた。
- lengthとreverseはつかうな!
- sum' r (y:ys) = sum' (y+r) ys
- 末尾再帰で書いても遅延評価があるのでスタックを消費する。
- ghc -O2をつけるとtailcallにしてくれたり。
- {- #LANGUAGE BangPattern# -}をつけて !r とすると正格評価になる。 ふつうは foldl' をつかう。
- (1+2)^2の例:
- 最内簡約: call-by-value。1+2を計算してから3^2を計算する。ツリーになる。
- 最外簡約: (1+2)^(1+2)に展開される。thunk渡し。でも共有されているので効率は悪くない。グラフになる(共有があるので)。このなかで余分な計算を省いたものを遅延評価とよぶ。
- MapReduce
- foldlはつかわないでfoldl'をつかえ
- foldrはtailcallではない
- [1,2,3,4] = 1:2:3:4: = (1 : (2 : (3 : (4 : ))))
- foldrは (1 + (2 + (3 +(4 + 0))))のイメージ
- foldlはtailcall → 数値との相性がよい (ただしimport Data.Listしてfoldl'をつかえ)
- mapもfilterもfoldr。
- 弱い ← map,filter ←→ foldr,foldl ←→ 再帰 → 強い
- sumはfoldl'だけど、forをbreakしたいようなときはfoldl。
- 文字列
- tails: サフィックスリストをかえす。
[2011-10-02 14:32]
第二部
[2011-10-02 14:53]
前回はsplitAtが解けたのに今回はわからなかった。
最後までたどりつけず。会場では高階関数をつかった演習が行なわれていた。
いくつか気になったこと:
- and/or/anyが遅い。Preludeのは速いし、foldrをつかった定義も遅くない。なぜだ..
- large = 2 ^ 10 くらいに減らしとかないとテストに時間がかかってイライラする。
- 空リストをうけつけない関数であっても foo [] = error "hoge" のように定義しておかないとテストをとおらない。
- linesは外側の再帰を自然な再帰にしとかないとテストがとおらない。
[2011-10-02 18:06]
懇親会はパスして、ベルポートでハンバーガーをくって帰宅(実際には会社に寄って電源タップと仕事用のHHKBproを置いてきた)。