En primer lugar, es muy común confundir la aplicación de función parcial para currying. Ver this por ejemplo (estoy seguro de que hay mejores recursos describiéndolo, pero este fue el primero que encontré). Casi nunca he visto a nadie usar currying en la práctica (excepto en idiomas como Haskell, donde cada función está guiada por el lenguaje en sí, por así decirlo, pero incluso eso es para permitir la aplicación de funciones parciales simples). La aplicación de funciones parciales, por otro lado, es bastante útil en muchos idiomas.
De todos modos, suponiendo que está hablando de aplicación de función parcial (ya que la gente está hablando de ellos cuando preguntan sobre el currying), el concepto no es tan natural en C++ como en un lenguaje (puramente) funcional , como Haskell, por ejemplo.
Por ejemplo, aquí definimos una función sum
que toma una matriz de números list
y suma todos los números. Si no está familiarizado con el concepto de plegar (o reducir o inyectar, como a veces se le llama), lea this. De todos modos, se vería así:
sum list = foldl (+) 0 list
Pero espera un minuto. ¡Podríamos acortarlo usando la aplicación de función parcial! En lugar de proporcionar un argumento, simplemente decimos que sum
es una función que es igual a foldl, con + y 0 aplicados parcialmente.
sum = foldl (+) 0
¿Cuál es más fácil de leer? Una cuestión de preferencia, probablemente, pero la segunda enfatiza más claramente la relación entre suma y doblez en mi opinión. Y tenga en cuenta que este es un ejemplo muy simple. Honestamente, no sé cómo escribir un buen ejemplo en C++, así que tendrás que disculparme allí. En cualquier caso, ¿cuál es la ventaja práctica? Legibilidad. Intento más claro. Código más corto.
responsabilidad: Si realmente quería saber las ventajas de currying (en comparación con aplicación de función parcial) Siento haber hecho de leer todo esto. Pero, por otro lado, si comprende que la diferencia entre los dos también comprenderá que currying es una gran manera de implementar la aplicación de función parcial.
Esto parece relacionado: http://stackoverflow.com/questions/4888480/practical-use-of-curried-functions/4894045#4894045 - ¿Responde a su pregunta? –
Gracias. La publicación de Jakob me dio mucha información en este caso. La publicación vinculada se basa en eso. –
Hay un ejemplo simple, no teórico, en esta respuesta: http://stackoverflow.com/questions/2725811/is-currying-just-a-way-to-avoid-inheritance/2725841#2725841 – jtolle