ruby monad
TRANSCRIPT
![Page 1: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/1.jpg)
純粋関数型言語Ruby (3)
氏久 達博
2008-02-16Ruby勉強会@関西 23
![Page 2: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/2.jpg)
•氏久達博
•大阪大学大学院基礎工学研究科
•Fuzzy-Rough集合理論を研究
•RubyとHaskellを使っている•Kanasan.JSとかvim勉強会とか
![Page 3: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/3.jpg)
30分で分かるMonad
![Page 4: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/4.jpg)
•Monadとは
•Monadの種類
•Monadの使い方,Monadの応用例
•おまけ
![Page 5: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/5.jpg)
![Page 6: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/6.jpg)
“モナドは値およびその値を使う計算の並びという観点からいえば、計算を構造化 する方法です。”
![Page 7: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/7.jpg)
“モナドを、計算を合成して、より複雑な計算にする戦略と考えると いいでしょう。”
![Page 8: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/8.jpg)
“掛け算みたいなもの”
![Page 9: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/9.jpg)
•Monadの種類• Identity Monad
• Maybe Monad
• Error Monad
• List Monad
• IO Monad
• State Monad
• Reader Monad
• Writer Monad
• Continuation Monad
![Page 10: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/10.jpg)
Maybe Monad
![Page 11: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/11.jpg)
•ありがちなコード
g = (f1 && f2 && f3 && f4)
![Page 12: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/12.jpg)
g = if f1 if f2 if f3 f4 end end end
user.child.child
![Page 13: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/13.jpg)
•ありがちなコード
g = ( a = f1 && b = f2(a) && c = f3(b) && f4(a, c))
![Page 14: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/14.jpg)
•f(x)はnilか数値
•xがnilだと、必ずnil
•(f, &&, nil) はモナド
f(x) -> nil ¦ Fixnum
![Page 15: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/15.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/16.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/17.jpg)
•bindとreturn
•&&とnil
>>=return
![Page 18: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/18.jpg)
Q. 副作用が怖い人?
![Page 19: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/19.jpg)
•入出力
•引数・返り値以外の変数の更新
![Page 20: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/20.jpg)
IO Monad
![Page 21: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/21.jpg)
•可換な演算子と、非可換な演算子•:: [] +(単項) ! ~ ** -(単項) * / % + - << >> & | ^ > >= < <= <=> == === != =~ !~ && || .. ... ?:(条件演算子) =(+=, -= ... ) not and or
![Page 22: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/22.jpg)
•1 + 2 == 2 + 1
•1 * 2 == 2 * 1•1 && 2 == 2 && 1
![Page 23: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/23.jpg)
•短絡評価•f1 && f2•f1 || f2•順序を変えられない•変えたくないときに…!
![Page 24: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/24.jpg)
puts 'a'puts 'b'puts 'c'
•上から実行されるため、必ずa, b, cの順
![Page 25: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/25.jpg)
main = putStrLn "a" >> putStrLn "b" >> putStrLn "c"
•>>によって強制的に左から実行させている
![Page 26: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/26.jpg)
Writer, Reader and State Monad
![Page 27: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/27.jpg)
•関数の引数以外に参照できるデータ: 副値•インスタンス変数、クラス変数、グローバル変数、定数、ローカル変数、ObjectSpace._id2ref
![Page 28: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/28.jpg)
•Writer Monad引数・返り値以外の環境に値を保持
•Reader Monad引数・返り値以外の環境の値を参照
•State Monad両方
![Page 29: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/29.jpg)
•>>=で繋がった一連の流れの中だけで共有
g x = f1 x >>= g2 >>= f3
![Page 30: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/30.jpg)
Rubyによるモナドの実装?
![Page 31: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/31.jpg)
![Page 32: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/32.jpg)
$ vim /opt/local/lib/ruby/gems/
1.8/gems/rushcheck-0.8/lib/rushcheck/
gen.rb
![Page 33: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/33.jpg)
![Page 34: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/34.jpg)
他にもMonad Plusなど。
“足し算みたいなもの”
![Page 35: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/35.jpg)
end
![Page 36: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/36.jpg)
関数型言語RubyHotNews!
![Page 37: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/37.jpg)
• みんなでHaskellの処理系を作っちゃおうぜ! というイベント
• 3/1(土) 大阪梅田 グッデイ(株)
• 関東会場もあり
Haskell Hackathon 2008
![Page 38: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/38.jpg)
Haskell勉強会#9
• 2/22 (金) 18時~21時
• 大阪 蛍池公民館
• 青木峰郎「ふつうのHaskell」
• parsec
![Page 39: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/39.jpg)
curry実装
• [ruby-dev:33676]
• Rubyでもカリーが...!
![Page 40: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/40.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/41.jpg)
s = lambda {¦f, g, x¦ f[x][g[x]] }.curryk = lambda {¦x, y¦ x }.curry
![Page 42: Ruby Monad](https://reader034.vdocument.in/reader034/viewer/2022052315/5549407cb4c905054d8b5021/html5/thumbnails/42.jpg)
end