Quelques fonctions de base:
public static class Functionals
{
// Y-Combinateur à un argument.
public static Func Y(Func, Func> F)
{
return t => F(Y(F))(t);
}
// Y-Combinateur à deux arguments.
public static Func Y(Func, Func> F)
{
return (t1, t2) => F(Y(F))(t1, t2);
}
// Y-Combinateur à trois arguments.
public static Func Y(Func, Func> F)
{
return (t1, t2, t3) => F(Y(F))(t1, t2, t3);
}
// Y-Combinateur à quatre arguments.
public static Func Y(Func, Func> F)
{
return (t1, t2, t3, t4) => F(Y(F))(t1, t2, t3, t4);
}
// Currying du premier argument
public static Func> Curry(Func F)
{
return t1 => t2 => F(t1, t2);
}
// Currying du deuxième argument
public static Func> Curry2nd(Func F)
{
return t2 => t1 => F(t1, t2);
}
// Uncurrying du premier argument
public static Func Uncurry(Func> F)
{
return (t1, t2) => F(t1)(t2);
}
// Uncurrying du deuxième argument
public static Func Uncurry2nd(Func> F)
{
return (t1, t2) => F(t2)(t1);
}
}
Ça ne sert pas à grand-chose si vous ne savez pas comment les utiliser. Pour le savoir, vous devez savoir à quoi ils servent: