Ruby でカリー化

Ruby では #curryProc オブジェクトをカリー化する事ができます。

plus = proc { |a, b, c| a + b + c }

# 第一引数に 3 を渡した状態の Proc オブジェクトを返す
plus3 = plus.curry.call 3

# 引数分の数が渡されたらブロックの結果が返ってくる
plus3.call(4).call(2)
# => 9

# 同時に引数を渡すこともできる
plus3.call -2, 3
# => 4

# ブロックのオブジェクトとして渡したり
[1, 2, 3].map &plus.curry.call(1, 2)
# => [4, 5, 6]

#curry でカリー化した Proc オブジェクに引数分の値を渡すと評価された結果が返ってきます。
引数の数が足りない場合は、部分適用した Proc オブジェクトを返します。
これは次のように第一引数を束縛したい場合に便利です。

plus = proc { |a, b| a + b }

# ブロックのオブジェクトとして渡したり
[1, 2, 3].map &plus.curry.call(3)
# => [4, 5, 6]