2011-03-14 19 views
17

Veo mucha documentación y preguntas sobre cuál es la técnica de currículum, pero he encontrado muy poca información sobre por qué uno la usaría en la práctica. Mi pregunta es, ¿cuáles son las ventajas de currying? Tal vez pueda proporcionar un ejemplo trivial en el que el currículum sea preferible a la invocación de método convencional.¿Cuáles son las ventajas prácticas del currying?

Trabajo en C++ mientras el sol está arriba, por lo que hasta la fecha he tenido poca exposición al currículum que no sea el trabajo fuera de mi lugar jugando con idiomas.

+1

Esto parece relacionado: http://stackoverflow.com/questions/4888480/practical-use-of-curried-functions/4894045#4894045 - ¿Responde a su pregunta? –

+0

Gracias. La publicación de Jakob me dio mucha información en este caso. La publicación vinculada se basa en eso. –

+1

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

Respuesta

13

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.

+3

Creo que su El punto se ilustra más claramente simplemente con la aplicación parcial de + en su primer ejemplo. Además, ¿no necesita currying para poder hacer una aplicación parcial? Así que currying, como el proceso que transforma los argumentos agrupados para curried argumentos (por ejemplo, la función de 'curry' en Haskell) es muy útil. –

+0

"Legibilidad. Intento más claro. Código más corto" - francamente este es un argumento terriblemente débil, teniendo en cuenta lo poco que generalmente es el código de la función NOT legible. Creo que solo dices 'porque la familiaridad es parcial'. – JoyalToTheWorld

Cuestiones relacionadas