Supongamos que quiero poner en práctica una composición funcional, así:inferencia de tipos genéricos con la composición funcional
public Func<T,T> Compose<T>(Func<T,T> f, Func<T,T> g)
{
return new Func<T,T>(x => f(g(x)));
}
Ahora bien, en la práctica, puedo utilizar este Componer() fn así:
public String ToUpper(String s) { return s.ToUpper(); }
public String Replicate(String s) { return s+s; }
public void Run()
{
var h = Compose<String>(ToUpper, Replicate);
System.Console.WriteLine("{0}", h("fred"));
}
Y el resultado es FREDFRED
.
¿Hay alguna manera de usar una sintaxis más simple para invocar a Compose? He intentado de esta manera:
var h = Compose(ToUpper, Replicate);
... pero me da un error de compilación:
error CS0411: The type arguments for method 'FunctionalTest.Compose(System.Func, System.Func)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
bastante comprensible. Me pregunto si es posible declararlo de manera diferente y lograr que la inferencia funcione realmente.
EDITAR
El origen del problema: yo estaba viendo una charla en línea de un curso de licenciatura programación funcional, CS61A de la UC Berkley. (encuéntrelo en youtube). No tengo ningún entrenamiento formal en FP, y pensé que podría aprender algo. El programa de prof usa y él habla sobre cómo el esquema + ceceo son lenguajes puramente funcionales, y otros idiomas lo son menos. Específicamente identificó a Pascal, C, C++ y Java (pero no C#) como carentes de capacidades funcionales, y dijo que sería difícil hacer una composición funcional con estos idiomas ("Sin pararse en la cabeza"). Afirmó que un puntero a función (como disponible en C, C++) no es lo mismo que una función "entidad", una lambda. Lo entiendo.
Divertido - no mencionó Javascript o C#, que considero que son los principales lenguajes que tienen capacidades funcionales bastante buenas. (No sé F #.)
Me resulta curioso que esta sea una conferencia del año pasado - hace 14 meses - y sin embargo, parece desconocer los aspectos funcionales de los principales idiomas modernos.
Así que estoy siguiendo y haciendo ejercicios, pero en lugar de usar esquema o lisp, estoy usando C#. Y también haciendo algunos de ellos en Javascript.
De todos modos, gracias a todos por las respuestas de calidad.
punta tangencial: se puede generalizar el método 'Compose' más como esto: http://paste.pocoo.org/show/393393/ – missingfaktor
¿No funciona la composición tiene un tipo más general? 'Func Componer (Func f, Func g)' (traducido del Haskell '(.) :: (b -> c) -> (a -> b) -> a -> c'). –