Ruby でカリー化
Ruby では #curry
で Proc
オブジェクトをカリー化する事ができます。
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]