rubyで関数型プログラミングをするためのgemを作った
DESCRIPTION
Rubyで関数型プログラミングをするために作った immutable_list gem の紹介です。 IT Cafe'2013というイベントでLTする予定です。TRANSCRIPT
![Page 1: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/1.jpg)
Rubyで関数型プログラミングをするためのgemを作った
@gam0022
![Page 2: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/2.jpg)
自己紹介
Twitter: @gam0022
情報科学類3年(coins11)
大五郎botの飼い主
COJT SWコース
Ruby と C#
けっこうなんでも書きます
![Page 3: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/3.jpg)
Rubyで関数型プログラミング
一般的な言語がループで繰り返しを表現するのに対して
再帰を用いて繰り返しを表現することをここでは、
関数型プログラミングと呼ぶことにします。
![Page 4: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/4.jpg)
Rubyで関数型プログラミング
Ruby の Array は 配列で実装されている。
次の操作が遅い + メモリを消費する先頭への要素の追加(cons)
連結(append)
push などが破壊的操作
関数型プログラミングをするのには致命的
![Page 5: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/5.jpg)
Rubyで関数型プログラミング
リストのデータ構造を自分で作ってみた!
ImmutableList
![Page 6: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/6.jpg)
ImmutableList
特徴
単方向連結リスト(singly-circularly-linked list)
非破壊的(immutable)
Cで実装 (C Extensions)
動作が高速
![Page 7: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/7.jpg)
ImmutableList
OCaml を意識したメソッド
cons
head, tail
rev_append, rev, append
length
nth
![Page 8: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/8.jpg)
Basic
![Page 9: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/9.jpg)
Quick Sort
クイックソート
一般的に最も高速なソート O(n log n)、安定ソートではない
アルゴリズム
1. 適当に数(ピポット)を選ぶ
2. ピポットより小さい数を前方、大きい数を後方に分割
3. 2分割された各々のデータを、それぞれソート(1に戻る)
![Page 10: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/10.jpg)
Quick Sort
![Page 11: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/11.jpg)
Benchmark
先頭に長さ3のリストを連結するのにかかった秒数
連結回数 Array ImmutableList
10 1.50E-05 2.00E-05
1000 0.007251 0.00166
10000 0.727542 0.015206
100000 102.080825 0.414083
![Page 12: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/12.jpg)
RubyGemsで公開中
RubyGemとは
Rubyのライブラリのパッケージ管理システム
![Page 13: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/13.jpg)
Install
コマンド一発で導入可能
![Page 14: Rubyで関数型プログラミングをするためのgemを作った](https://reader033.vdocuments.pub/reader033/viewer/2022060122/559641181a28ab3e558b46f9/html5/thumbnails/14.jpg)
ご静聴ありがとうございました
詳しい話はブログで
http://gam0022.net/blog/2013/10/22/immutable-list-gem/
http://gam0022.net/blog/2013/10/18/gems-with-extensions/