rubyで関数型プログラミングをするためのgemを作った

14
Rubyで関数型プログラミン グをするためのgemを作った @gam0022

Upload: sho-hosoda

Post on 03-Jul-2015

464 views

Category:

Technology


4 download

DESCRIPTION

Rubyで関数型プログラミングをするために作った immutable_list gem の紹介です。 IT Cafe'2013というイベントでLTする予定です。

TRANSCRIPT

Page 1: Rubyで関数型プログラミングをするためのgemを作った

Rubyで関数型プログラミングをするためのgemを作った

@gam0022

Page 2: Rubyで関数型プログラミングをするためのgemを作った

自己紹介

Twitter: @gam0022

情報科学類3年(coins11)

大五郎botの飼い主

COJT SWコース

Ruby と C#

けっこうなんでも書きます

Page 3: Rubyで関数型プログラミングをするためのgemを作った

Rubyで関数型プログラミング

一般的な言語がループで繰り返しを表現するのに対して

再帰を用いて繰り返しを表現することをここでは、

関数型プログラミングと呼ぶことにします。

Page 4: Rubyで関数型プログラミングをするためのgemを作った

Rubyで関数型プログラミング

Ruby の Array は 配列で実装されている。

次の操作が遅い + メモリを消費する先頭への要素の追加(cons)

連結(append)

push などが破壊的操作

関数型プログラミングをするのには致命的

Page 5: Rubyで関数型プログラミングをするためのgemを作った

Rubyで関数型プログラミング

リストのデータ構造を自分で作ってみた!

ImmutableList

Page 6: Rubyで関数型プログラミングをするためのgemを作った

ImmutableList

特徴

単方向連結リスト(singly-circularly-linked list)

非破壊的(immutable)

Cで実装 (C Extensions)

動作が高速

Page 7: Rubyで関数型プログラミングをするためのgemを作った

ImmutableList

OCaml を意識したメソッド

cons

head, tail

rev_append, rev, append

length

nth

Page 8: Rubyで関数型プログラミングをするためのgemを作った

Basic

Page 9: Rubyで関数型プログラミングをするためのgemを作った

Quick Sort

クイックソート

一般的に最も高速なソート O(n log n)、安定ソートではない

アルゴリズム

1. 適当に数(ピポット)を選ぶ

2. ピポットより小さい数を前方、大きい数を後方に分割

3. 2分割された各々のデータを、それぞれソート(1に戻る)

Page 10: Rubyで関数型プログラミングをするためのgemを作った

Quick Sort

Page 11: Rubyで関数型プログラミングをするためのgemを作った

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を作った

RubyGemsで公開中

RubyGemとは

Rubyのライブラリのパッケージ管理システム

Page 13: Rubyで関数型プログラミングをするためのgemを作った

Install

コマンド一発で導入可能

Page 14: Rubyで関数型プログラミングをするためのgemを作った

ご静聴ありがとうございました

詳しい話はブログで

http://gam0022.net/blog/2013/10/22/immutable-list-gem/

http://gam0022.net/blog/2013/10/18/gems-with-extensions/