konto usunięte
Temat: C# 4.0 Dynamic
Jako że umarzam że dynamic w aspekcie obiektowym jest zły, to w aspekcie funkcyjnym robi na mnie wrażenie, oto kolejne podejście do funkcji Curry tym razem z użyciem dynamica (poprzednia wersja na moim blogu).
/// <summary>
/// the basic Curry function.
/// </summary>
/// <param name="num">num.</param>
/// <returns>List of System Func dynamic dynamic.</returns>
public static Func<dynamic, dynamic> Curry(int num)
{
int acc = num;
return delegate(dynamic dyn)
{
if (dyn is Func<dynamic, dynamic>)
{
return dyn(acc);
}
acc += dyn;
return acc;
};
}
/// <summary>
/// the Curry2 function that utilizes the dynamic keyword.
/// </summary>
/// <param name="num">num.</param>
/// <returns>List of System Func dynamic dynamic.</returns>
public static Func<dynamic, dynamic> Curry2(int num)
{
int acc = num;
return delegate(dynamic dyn)
{
if (dyn is bool)
{
return acc;
}
acc += dyn;
return new Func<dynamic, dynamic>(Curry2(acc));
};
}
kod jest dość prosty, i jak widać jest tu dużo miejsca na poprawki, lecz ważniejsza jest tu istota co z tym można zrobić, oto przykład.
Func<dynamic,dynamic> fun1 = Program.Curry(1);
Func<dynamic,dynamic> fun2 = Program.Curry(2);
var res = Program.Curry(3)(fun1(fun2)); //6
var result = Program.Curry2(1)(2)(4)(5)(10)(false); //22
Func<dynamic, dynamic> fun3 = Program.Curry2(1)(2);
var result2 = fun3(1)(5)(false); //9
Console.ReadKey();
Jak widać nasza funkcja zwraca nowy delegat do samej siebie, chyba że parametrem będzie bool wtedy nasz curry accumulator, przerywa sumowanie i podaje wynik, po wprowadzeniu dynamica oraz lambd możliwym stało się zaimplementowanie całego rachunku lambdy.
Więc operatory jak S,K,Y oraz T i F są możliwe do zaimplementowania w C#.
Edit: pozwoliłem sobie rozszerzyć temat o kolejne przykłady, tekst można znaleźć tutaj: http://badamczewski.blogspot.com/2010/04/c-dynamic.htmlBartosz Adamczewski edytował(a) ten post dnia 30.04.10 o godzinie 16:02