ruby monad

42
純粋関数型言語Ruby (3) 氏久 達博 2008-02-16 Ruby勉強会@関西 23

Upload: ujihisa

Post on 06-May-2015

2.674 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Ruby Monad

純粋関数型言語Ruby (3)

氏久 達博

2008-02-16Ruby勉強会@関西 23

Page 2: Ruby Monad

•氏久達博

•大阪大学大学院基礎工学研究科

•Fuzzy-Rough集合理論を研究

•RubyとHaskellを使っている•Kanasan.JSとかvim勉強会とか

Page 3: Ruby Monad

30分で分かるMonad

Page 4: Ruby Monad

•Monadとは

•Monadの種類

•Monadの使い方,Monadの応用例

•おまけ

Page 5: Ruby Monad
Page 6: Ruby Monad

“モナドは値およびその値を使う計算の並びという観点からいえば、計算を構造化 する方法です。”

Page 7: Ruby Monad

“モナドを、計算を合成して、より複雑な計算にする戦略と考えると いいでしょう。”

Page 8: Ruby Monad

“掛け算みたいなもの”

Page 9: Ruby Monad

•Monadの種類• Identity Monad

• Maybe Monad

• Error Monad

• List Monad

• IO Monad

• State Monad

• Reader Monad

• Writer Monad

• Continuation Monad

Page 10: Ruby Monad

Maybe Monad

Page 11: Ruby Monad

•ありがちなコード

g = (f1 && f2 && f3 && f4)

Page 12: Ruby Monad

g = if f1 if f2 if f3 f4 end end end

user.child.child

Page 13: Ruby Monad

•ありがちなコード

g = ( a = f1 && b = f2(a) && c = f3(b) && f4(a, c))

Page 14: Ruby Monad

•f(x)はnilか数値

•xがnilだと、必ずnil

•(f, &&, nil) はモナド

f(x) -> nil ¦ Fixnum

Page 15: Ruby Monad

f1 = lambda {¦x¦ x.nil? ? nil : x > 10 ? x : nil }f2 = lambda {¦x¦ x.nil? ? nil : x < 12 ? x : nil }g = lambda {¦x¦ (a = f1[x]) && f2[a] }

p (9..13).map {¦i¦ g[i] }#=> [nil, nil, 11, nil, nil]

Page 16: Ruby Monad

g = do a <- f1 b <- f2 a c <- f3 b f4 c

g = f1 >>= f2 >>= f3 >>= f4

g = f1 >>= (\a -> f2 a) >>= (\b -> f3 b) >>= (\c -> f4 c)

Page 17: Ruby Monad

•bindとreturn

•&&とnil

>>=return

Page 18: Ruby Monad

Q. 副作用が怖い人?

Page 19: Ruby Monad

•入出力

•引数・返り値以外の変数の更新

Page 20: Ruby Monad

IO Monad

Page 21: Ruby Monad

•可換な演算子と、非可換な演算子•:: [] +(単項) ! ~ ** -(単項) * / % + - << >> & | ^ > >= < <= <=> == === != =~ !~ && || .. ... ?:(条件演算子) =(+=, -= ... ) not and or

Page 22: Ruby Monad

•1 + 2 == 2 + 1

•1 * 2 == 2 * 1•1 && 2 == 2 && 1

Page 23: Ruby Monad

•短絡評価•f1 && f2•f1 || f2•順序を変えられない•変えたくないときに…!

Page 24: Ruby Monad

puts 'a'puts 'b'puts 'c'

•上から実行されるため、必ずa, b, cの順

Page 25: Ruby Monad

main = putStrLn "a" >> putStrLn "b" >> putStrLn "c"

•>>によって強制的に左から実行させている

Page 26: Ruby Monad

Writer, Reader and State Monad

Page 27: Ruby Monad

•関数の引数以外に参照できるデータ: 副値•インスタンス変数、クラス変数、グローバル変数、定数、ローカル変数、ObjectSpace._id2ref

Page 28: Ruby Monad

•Writer Monad引数・返り値以外の環境に値を保持

•Reader Monad引数・返り値以外の環境の値を参照

•State Monad両方

Page 29: Ruby Monad

•>>=で繋がった一連の流れの中だけで共有

g x = f1 x >>= g2 >>= f3

Page 30: Ruby Monad

Rubyによるモナドの実装?

Page 31: Ruby Monad
Page 32: Ruby Monad

$ vim /opt/local/lib/ruby/gems/

1.8/gems/rushcheck-0.8/lib/rushcheck/

gen.rb

Page 33: Ruby Monad
Page 34: Ruby Monad

他にもMonad Plusなど。

“足し算みたいなもの”

Page 35: Ruby Monad

end

Page 36: Ruby Monad

関数型言語RubyHotNews!

Page 37: Ruby Monad

• みんなでHaskellの処理系を作っちゃおうぜ! というイベント

• 3/1(土) 大阪梅田 グッデイ(株)

• 関東会場もあり

Haskell Hackathon 2008

Page 38: Ruby Monad

Haskell勉強会#9

• 2/22 (金) 18時~21時

• 大阪 蛍池公民館

• 青木峰郎「ふつうのHaskell」

• parsec

Page 39: Ruby Monad

curry実装

• [ruby-dev:33676]

• Rubyでもカリーが...!

Page 40: Ruby Monad

curry実装

• [ruby-dev:33676]

• Rubyでもカリーが...!

lambda {¦x, y, z¦ x + y + z }.currylambda {¦x¦ lambda {¦y¦ lambda {¦z¦ x + y + z } } }

Page 41: Ruby Monad

s = lambda {¦f, g, x¦ f[x][g[x]] }.curryk = lambda {¦x, y¦ x }.curry

Page 42: Ruby Monad

end