Purely functional programming in Ruby



Similar documents
2

(1)1オールゼロ 記 録 ケース 厚 生 年 金 期 間 A B 及 びCに 係 る 旧 厚 生 年 金 保 険 法 の 老 齢 年 金 ( 以 下 旧 厚 老 という )の 受 給 者 に 時 効 特 例 法 施 行 後 厚 生 年 金 期 間 Dが 判 明 した Bは 事 業 所 記 号 が

目 次 ルール1 決 算 書 には2 人 の 主 役 がいる! (1) 貸 借 対 照 表 (BS) P4 (2) 損 益 計 算 書 (PL) P5 ルール2 BSには3つの 家 と6つの 部 屋! (1)BSの3つの 家 と6つの 部 屋 P6 (2) 資 産 ( 流 動 資 産 固 定 資 産

org/ghc/ Windows Linux RPM 3.2 GHCi GHC gcc javac ghc GHCi(ghci) GHCi Prelude> GHCi :load file :l file :also file :a file :reload :r :type expr :t exp

Microsoft Word - 第3章.doc

Taro-条文.jtd

¥×¥í¥°¥é¥ß¥ó¥°±é½¬I Exercise on Programming I [1zh] ` `%%%`#`&12_`__~~~ alse

PowerPoint Presentation

Microsoft PowerPoint ppt

XML形式の電子報告書作成に当たっての留意事項

平 成 27 年 11 月 ~ 平 成 28 年 4 月 に 公 開 の 対 象 となった 専 門 協 議 等 における 各 専 門 委 員 等 の 寄 附 金 契 約 金 等 の 受 取 状 況 審 査 ( 別 紙 ) 専 門 協 議 等 の 件 数 専 門 委 員 数 500 万 円 超 の 受

計算式の取り扱い

Microsoft Word - CiNii看護大

2 省 エネルギー 性 耐 震 性 及 バリアフリー 性 を 満 たす 住 宅 とは 新 築 住 宅 既 存 住 宅 ( 中 古 住 宅 ) 増 改 築 等 次 のいずれかの 住 宅 が 対 象 次 のいずれかの 住 宅 が 対 象 次 のいずれかの 住 宅 が 対 象 級 4の 住 宅 一 次 エ

第1章 財務諸表

2016 年 度 情 報 リテラシー 三 科 目 合 計 の 算 出 関 数 を 用 いて 各 教 科 の 平 均 点 と 最 高 点 を 求 めることにする この2つの 計 算 は [ホーム]タブのコマ ンドにも 用 意 されているが 今 回 は 関 数 として 作 成 する まず 表 に 三 科

全設健発第     号

<4D F736F F D208DEC90AC837D836A B81698F4390B394C5816A2E646F63>

私立大学等研究設備整備費等補助金(私立大学等

国 語 算 数 外 国 語 活 動 リズムを 感 じ 取 りながら 発 声 の 仕 方 に 気 をつけて 音 読 や 群 読 を 楽 しく 行 うことができる 漢 字 の 部 首 を 理 解 することが できる 整 数 の 加 法 減 法 乗 法 の 計 算 についての 理 解 を 深 め 確 実

r1.dvi


PowerPoint プレゼンテーション

不 利 益 処 分 に 係 る 法 令 名 漁 港 漁 場 整 備 法 第 39 条 の2 第 1 項 工 作 物 建 造 許 可 等 の 取 消 無 許 可 行 為 の 中 止 復 旧 命 令 等 法 令 の 定 め 第 39 条 の2 第 1 項 漁 港 管 理 者 は 次 の 各 号 のいずれ

養 老 保 険 の 減 額 払 済 保 険 への 変 更 1. 設 例 会 社 が 役 員 を 被 保 険 者 とし 死 亡 保 険 金 及 び 満 期 保 険 金 のいずれも 会 社 を 受 取 人 とする 養 老 保 険 に 加 入 してい る 場 合 を 解 説 します 資 金 繰 りの 都

< C A2E6169>

検 索 の 型 が FALSE 又 は 0 の 場 合 は 左 端 を 昇 順 に 並 べ 替 えておく 必 要 はありません が 該 当 する 値 がない 場 合 は エラーになります 旅 行 命 令 書 など 名 前 から 職 名 や 住 所 を VLOOKUP 関 数 で 取 得 する 場 合

bdd.gby

技 能 労 務 職 公 務 員 民 間 参 考 区 分 平 均 年 齢 職 員 数 平 均 給 与 月 額 平 均 給 与 月 額 平 均 給 料 月 額 (A) ( 国 ベース) 平 均 年 齢 平 均 給 与 月 額 対 応 する 民 間 の 類 似 職 種 東 庄 町 51.3 歳 18 77

質 問 票 ( 様 式 3) 質 問 番 号 62-1 質 問 内 容 鑑 定 評 価 依 頼 先 は 千 葉 県 などは 入 札 制 度 にしているが 神 奈 川 県 は 入 札 なのか?または 随 契 なのか?その 理 由 は? 地 価 調 査 業 務 は 単 にそれぞれの 地 点 の 鑑 定

Webサービス, 軽量プログラミング言語のIPv6対応Perl編

C. S2 X D. E.. (1) X S1 10 S2 X+S1 3 X+S S1S2 X+S1+S2 X S1 X+S S X+S2 X A. S1 2 a. b. c. d. e. 2

Microsoft Word - FrontMatter.doc

( 別 途 調 査 様 式 1) 減 損 損 失 を 認 識 するに 至 った 経 緯 等 1 列 2 列 3 列 4 列 5 列 6 列 7 列 8 列 9 列 10 列 11 列 12 列 13 列 14 列 15 列 16 列 17 列 18 列 19 列 20 列 21 列 22 列 固 定

Microsoft Word - 09-  研究計画 シラバス 英語科

<4D F736F F D208E52979C8CA78E598BC68F5790CF91A390698F9590AC8BE08CF D6A2E646F6378>

佐渡市都市計画区域の見直し

損 益 計 算 書 ( 自 平 成 25 年 4 月 1 日 至 平 成 26 年 3 月 31 日 ) ( 単 位 : 百 万 円 ) 科 目 金 額 営 業 収 益 75,917 取 引 参 加 料 金 39,032 上 場 関 係 収 入 11,772 情 報 関 係 収 入 13,352 そ

事前チェック提出用現況報告書作成ツール入力マニュアル(法人用)

2

スライド 1

担 当 分 のメニュー 6/21, 6/28: アルゴリズムについて 7/5: 出 張 につき 休 講 7/12, 7/19: プログラミングについて ( 補 講 の 予 定 内 容 は 未 定 です) 講 義 情 報

第1章 財務諸表

Functional Programming

平成22年度

公 営 企 業 職 員 の 状 況 1 水 道 事 業 1 職 員 給 与 費 の 状 況 ア 決 算 区 分 総 費 用 純 利 益 職 員 給 与 費 総 費 用 に 占 める ( 参 考 ) 職 員 給 与 費 比 率 22 年 度 の 総 費 用 に 占 A B B/A める 職 員 給 与

< BD90AC E E7392AC91BA96AF81453F3F3F3F14>

表紙

3 職 員 の 平 均 給 与 月 額 初 任 給 等 の 状 況 (1) 職 員 の 平 均 年 齢 平 均 給 料 月 額 及 び 平 均 給 与 月 額 の 状 況 (24 年 4 月 1 日 現 在 ) 1 一 般 行 政 職 平 均 年 齢 平 均 給 料 月 額 平 均 給 与 月 額

つくって学ぶプログラミング言語 RubyによるScheme処理系の実装

(4) ラスパイレス 指 数 の 状 況 (H20.4.1) 96.7 (H25.4.1) (H25.7.1) (H25.4.1), (H25.4.1) 参 考 値 98.3 (H25.7.1) (H20.4.1) (H25.4

第1回

1. 表 から 値 を 抽 出 する 説 明 1.1. 表 から 値 を 抽 出 するための 関 数 について 説 明 します LOOKUP VLOOKUP HLOOKUP 関 数 は 検 索 値 に 対 応 する 値 を 検 索 値 を 含 む 一 覧 表 から 抽 出 し てくれる 関 数 です

AtCoder Regular Contest 073 Editorial Kohei Morita(yosupo) A: Shiritori if python3 a, b, c = input().split() if a[len(a)-1] == b[0] and b[len(

●幼児教育振興法案

MEET 270

P1表紙

職 員 の 初 任 給 等 の 状 況 () 職 員 の 平 均 年 齢 平 均 給 料 月 額 及 び の 状 況 ( 年 4 月 日 現 在 ) 一 般 行 政 職 平 均 年 齢 平 均 給 料 月 額 ( ベース) 44. 歳 6,4, 歳,44 4,7 7,6 4. 歳 7,

駐 車 場 管 理 規 程

Word 003 スキルブック 06 - オブジェクトの 利 用 0.Word で 作 る 表 : 行 幅 を 最 小 値 より 小 さく 設 定 する 3 表 の 左 右 のサイズを 適 宜 調 整 します Word で 表 を 作 成 するとき, 列 幅, 行 幅 ともに 基 本 的 に 自 由

6 システムを 入 れているパソコンを 入 れ 替 えたいが どうしたらいいのか 元 のパソコンから 新 しいパソコンに 昨 年 度 入 力 データを 移 行 します 手 順 は 次 のとおりです 1 元 のパソコンでシステムを 起 動 して メニュー 画 面 から バックアップ リカバリ を 選

1 # include < stdio.h> 2 # include < string.h> 3 4 int main (){ 5 char str [222]; 6 scanf ("%s", str ); 7 int n= strlen ( str ); 8 for ( int i=n -2; i


Taro-データ公安委員会相互協力事

1_2013BS(0414)

<4D F736F F D F5A91EE8BC F368C8E3393FA8DC48D F C8E323893FA916493C B95AA8D CE3816A>

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

R4財務対応障害一覧

Microsoft PowerPoint - 報告書(概要).ppt


(4) ラスパイレス 指 数 の 状 況 ( 各 年 4 月 1 日 現 在 ) ( 例 ) ( 例 ) 15 (H2) (H2) (H24) (H24) (H25.4.1) (H25.4.1) (H24) (H24)

untitled

Microsoft PowerPoint - ProD0107.ppt

Microsoft PowerPoint - 経営事項審査.ppt

(4) 給 与 制 度 の 総 合 的 見 直 しの 実 施 状 況 について 概 要 国 の 給 与 制 度 の 総 合 的 見 直 しにおいては 俸 給 表 の 水 準 の 平 均 2の 引 下 げ 及 び 地 域 手 当 の 支 給 割 合 の 見 直 し 等 に 取 り 組 むとされている.

(2) 単 身 者 向 け 以 外 の 賃 貸 共 同 住 宅 等 当 該 建 物 に 対 して 新 たに 固 定 資 産 税 等 が 課 税 される 年 から 起 算 して5 年 間 とする ( 交 付 申 請 及 び 決 定 ) 第 5 条 補 助 金 の 交 付 を 受 けようとする 者 は

2 一 般 行 政 職 給 料 表 の 状 況 ( 平 成 22 年 4 月 1 日 現 在 ) 1 号 給 の 給 料 月 額 ( 単 位 : ) 1 級 2 級 3 級 4 級 5 級 6 級 7 級 135, , , , , ,600

10th Developer Camp - B6

老発第    第 号

はじめに 趣 旨 特 徴 本 教 材 は 相 手 からの 質 問 や 発 信 に 対 して 応 答 する という 状 況 だけを 想 定 して います 2~3 語 でなされる 英 語 の 返 事 応 答 を 確 実 に 教 材 の 目 的 は 返 事 応 答 の 際 に 必 要 となる 基 礎 土

Parametric Polymorphism


スライド 1

とする (1) 多 重 債 務 や 過 剰 債 務 を 抱 え 返 済 が 困 難 になっている 人 (2) 債 務 整 理 を 法 律 専 門 家 に 依 頼 した 直 後 や 債 務 整 理 途 上 の 人 (3) 収 入 よりも 生 活 費 が 多 くお 金 が 不 足 がちで 借 金 に 頼

消 費 ~ 軽 減 率 消 費 の 軽 減 率 制 度 が 消 費 率 10% 時 に 導 入 することとされています 平 成 26 年 4 月 1 日 平 成 27 年 10 月 1 日 ( 予 定 ) 消 費 率 5% 消 費 率 8% 消 費 率 10% 軽 減 率 の 導 入 平 成 26

< B839395CA8E6496F FC817A FC90B E786C73>

スライド 1

<4D F736F F D208ED089EF95DB8CAF89C193FC8FF38BB CC8EC091D492B28DB88C8B89CA82C982C282A282C42E646F63>

Box-Jenkinsの方法

(15) 兵 庫 県 道 高 速 湾 岸 線 (16) 神 戸 市 道 高 速 道 路 2 号 線 (17) 兵 庫 県 道 高 速 北 神 戸 線 (18) 神 戸 市 道 高 速 道 路 北 神 戸 線 (19) 神 戸 市 道 高 速 道 路 湾 岸 線 のうち 上 り 線 については 神 戸

Microsoft PowerPoint 資料6 技術基準.ppt [互換モード]

任意整理について | 多重債務Q&A | 公益財団法人 日本クレジットカウンセリング協会

別紙3

03 平成28年度文部科学省税制改正要望事項

<4D F736F F D208F7493FA95948E738A4A94AD8E968BC682CC8EE891B18B7982D18AEE8F8082C98AD682B782E98FF097E182C98AD682B782E98F9590AC8BE093998CF D6A B315D2E B4E88C A>

(Microsoft Word - Excel\211\236\227p2\217\315.docx)

神の錬金術プレビュー版

単回帰モデル

為 が 行 われるおそれがある 場 合 に 都 道 府 県 公 安 委 員 会 がその 指 定 暴 力 団 等 を 特 定 抗 争 指 定 暴 力 団 等 として 指 定 し その 所 属 する 指 定 暴 力 団 員 が 警 戒 区 域 内 において 暴 力 団 の 事 務 所 を 新 たに 設

Transcription:

Purely functional programming in Ruby Shugo Maeda 2012-09-15T10:00:00-2012-09-15T10:30:00

Who am I? ラベル 前 田 修 吾 Rubyコミッタ ネットワーク 応 用 通 信 研 究 所 取 締 役 Rubyアソシエーション 事 務 局 長 1

I love fishing

But, no fish today :-(

広告 Programmers wanted! http://www.netlab.jp/recruit/ 画像はイメージです

What is functional programming? このプレゼンテーションでの 定 義 副 作 用 を 用 いないプログラミング 純 粋 な 関 数 プログラミング = まったく 副 作 用 を 用 いないプログラミング 純 粋 な 関 数 プログラミングを 部 分 的 に 使 う Rubyでは 汚 いことは 普 通 にオブジェクト 指 向 の 流 儀 でやればい いでしょ 5

What are side-effects? 変 数 の 再 代 入 x = 0; 3.times { x += 1 } オブジェクトの 状 態 変 更 x = "foo"; x.upcase! 入 出 力 puts "hello, world" 6

Why functional programming? 生 産 性 のため? テストしやすい? 並 列 プログラミングのため? 何 かかっこよさそうだから 努 力 と 報 酬 が 相 関 すると 人 は 努 力 しなくなる 7

Is Ruby functional? 関 数 型 っぽい 要 素 ブロック lambda ifなどが 文 ではなく 式 でもやっぱり 命 令 型 言 語 変 数 の 再 代 入 定 数 ですら 基 本 的 なデータ 構 造 (String, Array, Hash)がmutable 8

Pseudo functional programming in Ruby よいinject a.inject(0) { x, y x + y } わるいinject a.inject({}) { h, (k, v) h[k] = v; h } ふつうのmap a.map { i i * 2 } 9

Persistent data structures 短 命 データ 構 造 変 更 を 加 えると 前 のデータが 失 われるデータ 構 造 RubyのArrayやHash 前 のデータを 取 っておきたい 時 はコピーが 必 要 永 続 データ 構 造 変 更 前 のバージョンのデータが 保 存 されるデータ 構 造 HaskellのListやMap 関 数 プログラミングだと 自 然 に 永 続 データ 構 造 になる 一 度 作 ったデータは 壊 せない 参 照 しなくなったデータはGCで 回 収 される 10

Is map functional? ぱっと 見 は 関 数 型 に 見 える a.map { i i * 2 } でも 実 装 は 命 令 型 def map ary = [] each { i ary.push(i) } return ary 11

Implementing lists 永 続 的 データ 構 造 としてリストを 実 装 する xs = List[1, 2, 3] ys = xs.cons(0) #=> List[0, 1, 2, 3] xs #=> List[1, 2, 3] 12

Representation of lists @head @tail List[1, 2, 3] Cons 1 @head @tail List[2, 3] Nil 2 @head @tail List[3] Other 3 Nil List[] 13

Definition of classes class List class Cons < List attr_reader :head, :tail def initialize(head, tail) @head = head @tail = tail Nil = List.new def Nil.head; raise "list is empty"; def Nil.tail; raise "list is empty"; 14

Constructor class List def self.[](*args) args.reverse_each.inject(nil) { x, y Cons.new(y, x) } 15

Don t use the if keyword Don t use the else keyword? Perfecting OO's Small Classes and Short Methods オブジェクト 指 向 というより 命 令 型 では? Haskellでは 逆 にelseを 省 略 できない 本 物 のオブジェクト 指 向 プログラマはifを 使 わない というのはちょっとおおげさ 16

Dynamic dispatching 実 行 時 に 呼 び 出 されるメソッドが 決 まる オブジェクト 指 向 の 常 套 手 段 関 数 型 言 語 ではパターンマッチを 使 う 詳 しくは 次 の 講 演 で データの 種 類 が 増 えた 時 に 対 応 しやすい if 式 だと 元 の 定 義 の 分 岐 を 増 やす 必 要 がある パターンマッチよりもある 意 味 で 限 定 的 再 帰 的 なデータに 深 くマッチさせるのは 難 しい ダブルディスパッチである 程 度 可 能? Rubyだとダックタイピングなのでより 柔 軟 な 面 も 17

Example of dynamic dispatching class Cons < List def empty? false def Nil.empty? true List[].empty? #=> true List[1].epmty? #=> false 18

Don t use the while keyword while 式 は 副 作 用 に 依 存 する class List def length result = 0 xs = self while!xs.empty? result += 1 xs = xs.tail return result 19

Use recursion class Cons < List def length tail.length + 1 def Nil.length 0 List[1, 2, 3].length #=> 0 List[*(1..9999)].length #=> SystemStackError 20

Use tail recursion class List def length; _length(0); class Cons < List def _length(n) tail._length(n + 1) def Nil._length(n) n 21

Tail call optimization # 末 尾 呼 び 出 しの 最 適 化 を 有 効 化 する 設 定 # 設 定 後 にコンパイルされたコードにのみ 有 効 RubyVM::InstructionSequence.compile_option = { } trace_instruction: false, tailcall_optimization: true require "list" # list.rbでは 最 適 化 が 有 効 List[*(1..9999)].length #=> 9999 Ruby 2.0ではデフォルトで 有 効 に? 22

Can you make this tail recursive? class Cons < List def map(&block) Cons.new(yield(head), tail.map(&block)) def Nil.map Nil 23

Does this work well? class List def map(&block); _map(nil, &block); class Cons < List def _map(xs, &block) tail._map(cons.new(yield(head), xs), &block) def Nil._map(xs); xs; 24

Correct answer class List def map(&block); rev_map(&block).reverse; def reverse; _reverse(nil); def rev_map(&block); _rev_map(nil, &block); class Cons < List def _reverse(xs) tail._reverse(cons.new(head, xs)) def _rev_map(xs, &block) tail._rev_map(cons.new(yield(head), xs), &block) def Nil._reverse(xs); xs; def Nil._rev_map(xs); xs; 25

Time efficiency and Space efficiency non-tail recursion 版 では 時 間 効 率 が 良 い 小 さい 入 力 に 有 利 tail recursion 版 では 空 間 効 率 が 良 い 大 きい 入 力 に 有 利 ただし 時 間 計 算 量 空 間 計 算 量 はどちらもO(n) tail recursion 版 はスタックを 消 費 しない 代 わりに 中 間 リストが 必 要 26

Folding 再 帰 は 強 力 だがわかりにくい 畳 み 込 み リストの 各 要 素 を 一 つの 値 (リストであることもある)に 畳 み 込 む 再 帰 を 直 接 使 うより 用 途 が 限 定 されるが わかりやすい Rubyだとinject def length inject(0) { x, y x + 1 } 27

foldr 右 からの 再 帰 non-tail recursion class Cons < List def foldr(e, &block) yield(head, tail.foldr(e, &block)) def Nil.foldr(e, &block) e 28

foldl 左 からの 再 帰 tail recursion class Cons < List def foldl(e, &block) tail.foldl(yield(e, head), &block) def Nil.foldl(e, &block) e 29

Right-associative and leftassociative operations foldrは 右 結 合 List[1,2,3].foldr(0, &:+) # 1 + (2 + (3 + 0)) foldlは 左 結 合 List[1,2,3].foldl(0, &:+) # ((0 + 1) + 2) + 3 30

map by foldr class List def map(&block) foldr(nil) { x, ys Cons.new(yield(x), ys) } Cons.newは 右 結 合 なのでfoldrを 使 うのが 自 然 31

map by foldl class List def map(&block) rev_map(&block).reverse def reverse foldl(nil) { xs, y Cons.new(y, xs) } def rev_map(&block) foldl(nil) { xs, y Cons.new(yield(y), xs) } 32

Feature #6242 Ruby should support lists I've heard that Ruby is a LISP. LISP stands for "LISt Processing." Hence, Ruby should support lists. I've attached a patch to add the classes List and Cons, and the cons operator `:::'. Listを 組 み 込 みクラスにしようという 提 案 33

Example >> S[1,2,3].inject(:+) => 6 >> S[1,2,3] => S[1, 2, 3] >> 0 ::: S[1,2,3] => S[0, 1, 2, 3] >> 0 ::: 1 ::: 2 ::: 3 ::: nil # 右 結 合 => S[0, 1, 2, 3] >> S[1,2,3].inject(:+) => 6 34

Discussion 35

Rejected 36

immutable 仕 方 がないのでgemで $ gem install immutable Immutableというモジュールを 提 供 require "immutable" include Immutable p List[1,2,3].map(&:to_s) #=> List["1", "2", "3"] 37

Lazy evaluation 必 要 になるまで 式 の 評 価 を 遅 延 させる def If(x, y, z) if x y else z x = If(1>2, 3+4, 5+6) # 3+4は 評 価 されない 38

Immutable::Promise 評 価 の 遅 延 (delay)と 強 制 (force)を 明 示 def If(x, y, z) if x.force y.force else z.force x = If(Promise.delay{1>2}, Promise.delay{3+4}, Promise.delay{5+6}) lambda/callと 何 が 違 うの? 39

Memoization 何 回 forceしても 一 回 しか 評 価 されない 効 率 のため 評 価 する 式 に 副 作 用 がなければ 結 果 は 同 じ 40

Promise.lazy Promise.lazy { x }はPromise.delay { x.force }と 同 じ 再 帰 してもスタックが 溢 れない 点 が 異 なる def loop Promise.lazy { loop } # Promise.delay { loop.force }だと # SystemStackErrorが 発 生 loop.force SRFI-45 参 照 41

How to make lazy methods コンストラクタをPromise.delayでくるむ 値 を 取 り 出 すところではforceする メソッド 本 体 をPromise.lazyでくるむ def stream_filter(s, &block) Promise.lazy { xs = s.force if xs.empty? Promise.delay { List[] } else... 42

Immutable::Stream 遅 延 リスト 要 素 の 値 が 必 要 になるまで 要 素 の 生 成 が 遅 延 される 43

Lazy evaluation with streams x = Stream.from(1) @head @tail?? 44

Lazy evaluation with streams @head @tail x = Stream.from(1) p x.drop(2).head #=> 2? @head @tail? @head @tail 3? 45

Example from Project Euler Problem 2 Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,... By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the evenvalued terms. 46

Answer fib = Stream.cons(->{1}, ->{Stream.cons(->{2}, ->{fib.zip_with(fib.tail, &:+)})}) p fib.filter(&:even?).take_while { n n <= 4_000_000 }.foldl(0, &:+) Stream.cons(->{...}, ->{...})のように->{}が 必 要 なのがちょっと 汚 い マクロがあれば 47

Answer by unfolding fib = Stream.unfoldr([1, 2]) { x, y [x, [y, x + y]] } p fib.filter(&:even?).take_while { n n <= 4_000_000 }.foldl(0, &:+) 48

Other data strutures Immutable::Map Immutable::Queue Immutable::Deque See Purely Functional Data Structures by Chris Okasaki 49

Benchmark SIZE = 10000 TIMES = 10 def run(bm, list, folding_method, msg) bm.report(msg) do TIMES.times do list.map { i i * 2}.s(folding_method, 0, &:+) Benchmark.bmbm do bm run(bm, (1..SIZE).to_a, :inject, "Array") run(bm, Immutable::List[*(1..SIZE)], :foldl, "List") run(bm, Immutable::Stream.from(1).take(SIZE), :foldl, "Stream") 50

Benchmark result Rehearsal ------------------------------------------ Array 0.080000 0.010000 0.090000 ( 0.074561) List 0.660000 0.000000 0.660000 ( 0.665009) Stream 5.340000 0.010000 5.350000 ( 5.351024) --------------------------------- total: 6.100000sec user system total real Array 0.080000 0.000000 0.080000 ( 0.079840) List 0.590000 0.000000 0.590000 ( 0.594458) Stream 4.570000 0.000000 4.570000 ( 4.583689) ListはArrayの7.4 倍 StreamはArrayの57.4 倍 遅 い! mapなしでfoldlだけだともうちょっと 早 い 51

Conclusion 関 数 プログラミングはかっこいい でも 大 抵 はArrayやHashを 使 う 方 がおすすめ 繰 り 返 しdupしてるようなコードはListやMapを 使 った 方 がいいかも 52

Slides 以 下 のURLで 入 手 可 能 http://shugo.net/tmp/functional_ruby.pdf 53

Thank you! 54