

カリー化した場合に引数が必要な場合とそうじゃない場合の違いがわかりません．  
シンボルからto_procした場合は可変長引数を取るので  
そのため引数が必要になるのでしょうか？？

[code]

    head :022 > f = proc { |x,y| x + y }
     => #<Proc:0x007fbb311a0088@(irb):22> 
    head :023 > f.curry(2).call(1).call(2)
     => 3 
    head :024 > f.curry.call(1).call(2)
     => 3 
    head :025 > f.curry.call(1,2)
     => 3 
    head :026 > :+.to_proc.curry.call(2, 3)
     => 5 
    head :027 > :+.to_proc.curry(2).call(2).call(3)
     => 5 
    head :028 > :+.to_proc.curry.call(2).call(3) # 指定しないとエラー
    
[/code]


CC BY-SA 3.0
2015-10-07T14:36:07.663
17380
2015-10-08T04:16:49.947
8722
question
ruby
rubyのカリー化で引数が必要な場合とそうでない場合の違い


> シンボルからto_procした場合は可変長引数を取るので そのため引数が必要になるのでしょうか？？

必ずしも必要なわけではありません。  
カリー化されたProcは「十分な数の引数が渡されると」評価されます。その十分な数の引数の数をcurry時に引数（arity）として指定するか、call時に自前で判断させるかの違いです。

[code]

    # 次の場合、十分な引数の数は２つと判断される
    f2 = proc { |x, y, *z| x + y + z.inject(:+) }
    f2.curry.call(1, 2, 3, 4)
    => 10
    f2.curry.call(1).call(2, 3, 4)
    => 10
    f2.curry.call(1).call(2).call(3, 4) # ２つ渡した時点で評価される
    TypeError: nil can't be coerced into Fixnum
    
[/code]

rubyのソース読んだわけではありませんが、挙動から察するにProc#arityの値を見て判断しているように思われます。

[code]

    f = proc { |x,y| x + y }
    f.arity #=> 2 ... ２つの実引数
    
    f2 = proc { |x, y, *z| x + y + z.inject(:+) }
    f2.arity #=> -3 ... ２つの実引数と１つの可変長引数
    
    :+.to_proc.arity #=> -1 ... ０個の実引数と１つの可変長引数
    
[/code]


CC BY-SA 3.0
2015-10-08T04:16:49.947
17405
2015-10-08T04:16:49.947
9608
17380
answer