Debajo de una función Compose
. Si f
y g
son funciones únicas que devuelven valores, entonces Compose(f,g)
devuelve una función que al llamar al x
realiza el equivalente a f(g(x))
.Composición de la función
static Func<X, Z> Compose<Z, Y, X>(Func<Y, Z> f,Func<X, Y> g)
{ return x => f(g(x)); }
Aquí hay un par de simples Func
valores que puede estar compuesto:
Func<int, bool> is_zero = x => { return x == 0; };
Func<int, int> mod_by_2 = x => { return x % 2; };
P. ej esto funciona:
Console.WriteLine(Compose(is_zero, mod_by_2)(4));
Sin embargo, si en lugar de tener estos métodos estáticos equivalentes:
static bool IsZero(int n) { return n == 0; }
static int ModBy2(int n) { return n % 2; }
el mismo ejemplo no funciona con ellos. Es decir. esto produce un error de tiempo de compilación:
Console.WriteLine(Compose(IsZero, ModBy2)(4));
tipos explícitamente que pasan a Compose
corrige el problema:
Console.WriteLine(Compose<bool, int, int>(IsZero, ModBy2)(4));
¿Hay alguna forma de escribir Compose
tal que funciona en los métodos estáticos sin los tipos explícitos?
¿Es este un buen enfoque para implementar Compose
? ¿Alguien puede hacer mejoras a esto?
rigidez C# 's en su tratamiento de los tipos de función/delegado es una cosa que siempre me ha frustrado cuando se compara con el pato -tipo de idiomas como JavaScript. –