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