C#3.0にカリー化が入った
Orcas β1にひっそりとカリー化が追加されていました。ついに来たかというか、やっぱり来たかというか。
Extension methods and Curried Delegates によれば、拡張メソッドをデリゲートでカリー化できるようになったそうな。ただし、参照型のみで値型はダメ。でもボックス化に限ってOK。
拡張メソッドのカリー化ってことは、つまりLINQで使えってことなんだろうけど、とりあえずLINQなしの簡単なサンプルを書いてみました。
using System; class Program { delegate int Increment( int n ); static void Main() { Increment inc = ( ( object ) 1 ).Add; Console.WriteLine( inc( 42 ) ); Console.WriteLine( inc( 2007 ) ); Console.ReadKey(); } } public static class Test { public static int Add( this object x, int y ) { return ( int ) x + y; } }
このサンプルはわざわざ拡張メソッドを使って、さらにわざわざカリー化してるんで、わざとらしいにもほどがあるって例ですが、大目に見てやってください。
拡張メソッドでAddを用意しておいて、Mainの1行目で int の 1 をボックス化したものを部分適用して inc というデリゲートを作っています。
関数の一部の引数を与えた関数(デリゲート)を作ったわけです。このように引数の一部を与えることを部分適用といいます。で、部分適用できる仕組みをカリー化といいます。カリーって変な言葉についてはぐぐって。
結果は期待通りに 43 と 2008 が表示されます。
ところで、カリー化のうまい使いどころって知らないんですが、どういうときにおいしいんだろう。LINQではソースと処理をくっつけて持ち運べるから使いどころがちょっとはありそうな気もするけど、そうそうないだろうなぁ。
関連
matarilloさんによるC#2.0でカリー化
- http://blog.inomata.lolipop.jp/?eid=343676
- http://blog.inomata.lolipop.jp/?eid=374410
- http://blog.inomata.lolipop.jp/?eid=374441
C#3.0のカリー化ネタは多杉なのでまたいつかまとめたい。
お昼前にカレーが食べたくなる話題でした。