c51d5954.jpg8b95e535.jpgあわてて家を出たので名札ケースと電源タップをもって出るのを忘れてしまった。しかたがないので会社に寄ってタップを調達した。

f444cbe9.jpg初めてのJR大森駅から道にまよわずビルに到着。

5c8f35e2.jpg社員のかたの誘導で部屋まで移動するがエレベータに乗りきれず下で待つも来ず。セミナールームが何階かわからないのでエレベータホールで待機してたら第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]

0598c4e0.jpga8196690.jpg休憩時間にチョコレートをもぐもぐ。(なんかにおったみたいですみません)

第二部

[2011-10-02 14:53]

f45e5e7e.jpgもくもくと。

前回はsplitAtが解けたのに今回はわからなかった。

最後までたどりつけず。会場では高階関数をつかった演習が行なわれていた。

いくつか気になったこと:

  • and/or/anyが遅い。Preludeのは速いし、foldrをつかった定義も遅くない。なぜだ..
    • large = 2 ^ 10 くらいに減らしとかないとテストに時間がかかってイライラする。
  • 空リストをうけつけない関数であっても foo [] = error "hoge" のように定義しておかないとテストをとおらない。
  • linesは外側の再帰を自然な再帰にしとかないとテストがとおらない。

[2011-10-02 18:06]

03b14e83.jpgaa8e73b4.jpg懇親会はパスして、ベルポートでハンバーガーをくって帰宅(実際には会社に寄って電源タップと仕事用のHHKBproを置いてきた)。