2006年6月7日水曜日

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

連続して束縛することを考えれば、こんな形のほうがいいかな?(修正しました)

class Program
{
static void Main(string[] args)
{
GenericFunctions.CurriedFunc<int, int, double> cf =
Curry.Create<int, int, double>(Devide);
Console.WriteLine(cf(3)(2));
Console.ReadLine();
}

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

class Curry
{
public static GenericFunctions.CurriedFunc<T0, T1, U> Create<T0, T1, U>
(GenericFunctions.Func<T0, T1, U> f)
{
return delegate(T0 arg0)
{
return delegate(T1 arg1)
{
return f(arg0, arg1);
};
};
}

public static GenericFunctions.CurriedFunc<T0, T1, T2, U> Create<T0, T1, T2, U>
(GenericFunctions.Func<T0, T1, T2, U> f)
{
return delegate(T0 arg0)
{
return delegate(T1 arg1)
{
return delegate(T2 arg2)
{
return f(arg0, arg1, arg2);
};
};
};
}
//以下略
}

namespace GenericFunctions
{
public delegate U Func<T0, U>(T0 arg0);
public delegate U Func<T0, T1, U>(T0 arg0, T1 arg1);
public delegate U Func<T0, T1, T2, U>(T0 arg0, T1 arg1, T2 arg2);
public delegate U Func<T0, T1, T2, T3, U>(T0 arg0, T1 arg1, T2 arg2, T3 arg3);
//以下略

public delegate Func<T1, U> CurriedFunc<T0, T1, U>(T0 arg0);
public delegate CurriedFunc<T1, T2, U> CurriedFunc<T0, T1, T2, U>(T0 arg0);
//以下略
}

0 件のコメント:

コメントを投稿