Cohi(こひ)とは?
びわこ開発合宿で開発したライブラリです。プレゼン資料へのリンクだけじゃアピールが足りないかなと思って、ブログに直してみました。
これって何?
- Rubyで関数型プログラミングをサポートするライブラリです。
- Haskellの影響を多分に受けています。
- HaskellのPreludeをRubyで実装しました。一晩でできる限り。コアの部分は100行弱。Preludeの部分は1000行ちょい。
cohi.rb … 95行 cohi/prelude.rb … 1011行
- 実装した関数 131 / Preludeの全関数 194 = 68%
- 実装をあきらめたのを除くと99%
とりあえずサンプル
- map
# map :: (a -> b) -> [a] -> [b] define(:map, [X, []]) do [] end define(:map, [X, X_XS]) do |f, x, xs| [f[x]] + map[f, xs] end
- 階乗
define(:fact) do |n| foldl1[mult, (1 .. n).to_a] end p fact[5] # => 120
- フィボナッチ数
define(:fib, [0]) { 0 } define(:fib, [1]) { 1 } define(:fib, [2]) { 1 } define(:fib) {|n| fib[n - 1] + fib[n - 2] } p fib[20]
特徴的な機能
- パターンマッチ
- カリー化
p map[curry(add, 10), [1, 2, 3]] # => [11, 12, 13]
- 関数合成
p map[(curry(mult, 2) * succ), [1, 2, 3]] # => [4, 6, 8]
- 関数適用(Haskellの$みたいなの)
p curry(mult, 2) ** succ ** 1 # => 4 p curry(mult, 2) ** succ[1] # => 4
Cohiの語源
- lambda → lamb → こひつじ → Cohi(こひ)
- MDD(Mascot Driven Development)
- マスコットはまだありません。募集中です。