原です。

>酒井です。

情報満載なので、いつも「日々の流転」楽しみにしております。_o_

>最近Haskellを使ってみて、カリー化された関数の部分適用が
>とても便利だったので、Rubyでも同じような事が出来ないか考えて、
>ちょっと書いてみました。

酒井さんの「メソッドのカリー化」のコードは載せないんですか?


そういえば「カリー化」の定義を言わないと。

多変数の関数、例えば f(x, y, z) に、対して

    F(x)(y)(z) = f(x, y, z)

を満たすような、関数の関数の、、、関数 F を作る事をカリー化って
いうんですよね。ここではその Proc バージョンであると。


>class Proc
>   def currying(*args)
>     ari = arity >= 0 ? arity : -arity - 1
>
>     if ari <= args.size
>       call(*args)
>     else
>       lambda{|*a| currying(*(args + a))}
>     end
>   end
>end

時節柄、Y で書いてみると、

class Proc
   Y = proc{|g| proc{|f| g[f[f]]}[proc{|f| g[proc{|x| f[f][x]}]}]}
   Currying = Y[
     proc{|f|
       proc{|s|
         proc{|*args|
           ari = s.arity >= 0 ? s.arity : -s.arity - 1
           if ari <= args.size
             s.call(*args)
           else
             lambda{|*a| f[s][*(args + a)]}
           end
         }
       }
     }
   ]
   
   def currying
     Currying[self]
   end
end

でしょうか。、、、これは無理矢理であまり面白くないか。(^^;