読者です 読者をやめる 読者になる 読者になる

ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

.NETでもカリー化できるかな?

結論:無理そうだけど部分適用ならできる。カリー化もできましたニーズ?しらない

たぶんこんな感じのオーバーロードを、Actionも含めて引数15個くらい*1まで用意しておけば、実用的な範囲で.NETでも部分適用できると思います。

public static Func<T2, T3, TOut> Apply<T1, T2, T3, TOut>(this Func<T1, T2, T3, TOut> func, T1 param)
{
    return (p2, p3) => func(param, p2, p3);
}

public static Func<T2, TOut> Apply<T1, T2, TOut>(this Func<T1, T2, TOut> func< T1 param)
{
    return p2 => func(param, p2);
}

// つかいかた
Func<DateTime, DateTime, int> compare = DateTime.Compare;
var compareToNow = compare.Apply(DateTime.Now);
compareToZero(hoge);

あとは2引数のとき限定でFlipでもつけておけばいいんじゃないかな。ニーズ?し(ry
カリー化できた人いたら教えろください

追記:カリー化できました

下のように、引数をひとつずつ順にラムダ式の引数にばらして順番に並べるとできました。返って来る型がやばいです

public static Func<T1, Func<T2, Func<T3, TOut>>> Curry<T1, T2, T3, TOut>(this Func<T1, T2, T3, TOut>)
{
    return p1 => p2 => p3 => func(p1 ,p2 ,p3);
}

// つかいかた
Func<DateTime, DateTime, int> compare = DateTime.Compare;
var compareToNow = compare.Curry()(DateTime.Now);
compareToZero(hoge);

*1:Reactive ExtentionsにあるZipとかのオーバーロードがそんな感じだった