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]

開発の動機

  • 僕がHaskell(とRuby)を勉強するために開発しました。
  • RubyでどこまでHaskellに近付けるかを追求しました。
  • やっぱり性能は二の次です。

特徴的な機能

  • パターンマッチ
  • カリー化
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)
  • マスコットはまだありません。募集中です。

インストール

  • gemでインストールできます。
$ gem install cohi

参照: http://rubyforge.org/projects/cohi/