2006年5月8日月曜日

C# 2.0でカリー化を考えてみる。


class Program
{
static void Main(string[] args)
{
Curry<double> c = new Curry<double>();
Program p = new Program();
Curry<double>.CurriedFunc cf = c.Make(p, "Devide");
Console.WriteLine(cf(2)(3));
Console.ReadLine();
}

public double Devide(int x, int y)
{
return (double)x / (double)y;
}
}

class Curry<T>
{
public delegate T BoundFunc(params object[] args);
public delegate BoundFunc CurriedFunc(params object[] args);

public CurriedFunc Make(object instance, string methodName)
{
MethodInfo mi = instance.GetType().GetMethod(methodName);
return delegate(object[] pre)
{
return delegate(object[] post)
{
ArrayList al = new ArrayList();
al.AddRange(pre);
al.AddRange(post);
return (T)mi.Invoke(instance, al.ToArray());
};
};
}
}

ジェネリクスを使う意味がよくわからない。
あとこれだとcf(1)(2)(3)(4)みたいに何度も束縛できない。
いまいちだなあ。

1 件のコメント:

  1. 自分メモ。http://blogs.msdn.com/sriram/archive/2005/08/07/448722.aspx を参考にすること。

    返信削除