Purely Functional Data Structures読書会 第4回
1/21 に、Purely Functional Data Structures読書会 第4回 に行ってきました。
まとめ的な: http://wiki.haskell.jp/Workshop/ReadPFDS/4
- 3.4 (c) (d)
@khibino
前回末尾再帰になっていなかったから、CPS変換して末尾再帰にしたらしい。
なんかいきなり継続の話に。
任意の場所で継続がとれる、call/cc スタイルの CPS だけを CPS という人もいるらしい。
- 3.10 (b)
@imsuten
http://blog-ja.intransient.info/2012/01/red-black-tree-balance.html
以下の balanceL も見ておくといい
http://hackage.haskell.org/packages/archive/containers/0.4.2.0/doc/html/src/Data-Map.html#Map
- 4
@master_q
4章をOCamlで書く
やる気のある資料: http://www.slideshare.net/master_q/pfds-4ocaml
$-notation の代わりに lazy キーワードを使う
lazy の後は気持ちよく全部括弧でくるむ!
(括弧が嫌なら begin/end も使える)
Lazy.force で取り出す
カリー形式だと一気にマッチできないので、タプルを使うことが多い (ML系)
fun plus($m, $n) = $m + n
↓
let plus (lazy m) (lazy n) = lazy (m + n)
-
- m + n の計算は遅延される
- m と n は評価されてしまう
fun lazy plus ($m, $n) = $m + n
=
fun plus (m, n) = $case (m, n) of ($m, $n) => force ($m + n)
↓
let plus m n = lazy (match (m, n) with (lazy m, lazy n) -> m + n)
-
- with の先でマッチした変数名を m, n として、そのスコープでもとの変数を隠すこともある
- シャドウイングという
- よく使うかは派閥による
- m, n の中身をほどくのも、その足し算も遅延される
- with の先でマッチした変数名を m, n として、そのスコープでもとの変数を隠すこともある
-
- Stream の型
- susp の代わりに Lazy.t を使う
- Stream の型
トップレベルの let はシャドウイング出来る
OCaml の文法は気違い (by kazu_yamamoto)
- 4.1
@seizans
fun dropA x = $case x of | (0, s) = force s | (n, $Nil) = force $Nil | (n, $Cons(x, s)) = force (dropA(n - 1, s))
fun dropB x = $case x of | (n, s) = force ( let fun dropB' (0, s) = s dropB' (n, $Nil) = $Nil dropB' (n, $Cons(x, s)) = dropB' (n - 1, s) in dropB' (n, s) )
force を中に入れたり外に出したりはできる。
n をばらしたとき、 force ($ ...) がいくつか出来るが、それは簡約可能。
- 4.2
@rf0444
遅延リストに対して insertion sort を作って、その計算量がソート済み先頭k要素を取ってくるなら、O(n*k) になるっていうの。
最初 Coq で計算量の証明をしようとしていたが、・・・挫折。
(跡地: https://github.com/rf0444/coq/tree/master/pfds)
前日に Haskell で作って、挙動を追うと、・・・あれ?挿入ソートというよりは・・・バブルソートの挙動になってる!!
https://github.com/rf0444/haskell/tree/master/study/PFDS/C4
ソート超奥深そう。
遅延リストの挿入ソートの挙動がバブルソートっぽくなるのは、アルゴリズムのなんとか変換とかいう概念があるらしい。
homomorphic sort でぐぐると幸せになれるらしい。
http://d.hatena.ne.jp/kazu-yamamoto/20110913/1315905876
- 5
@senzans
償却計算量、銀行家と物理屋の手法
ならし解析
アルゴリズムイントロダクションを読んで、比較すると面白いらしい。
用語対応: https://twitter.com/#!/seizans/status/158462657807138816
銀行家の方法は、正格/遅延リストで、積み立て/借金の方法で計算量を出す。
- 次回
引き続き 5章解説。
となりで @S1E11 が頑張って資料作っていた。