2012-05-16 11 views

Respuesta

10

El currying no es específico de la programación funcional, y la sobrecarga no es específica de la programación orientada a objetos.

"Currying" es el uso de funciones a las que puede pasar menos argumentos de los necesarios para obtener una función de los argumentos restantes. es decirsi tenemos una función plus que toma dos argumentos enteros y devuelve su suma, entonces podemos pasar el solo argumento1 al plus y el resultado es una función para agregar 1 a las cosas.

En la sintaxis Haskellish (con aplicación de función por adyacencia):

plusOne = plusCurried 1 
three = plusOne 2 
four = plusCurried 2 2 
five = plusUncurried 2 3 

En la sintaxis vagamente CISH (con aplicación de función entre paréntesis):

plusOne = plusCurried(1) 
three = plusOne(2) 
four = plusCurried(2)(2) 
five = plusUncurried(2, 3) 

se puede ver en estos dos ejemplos que plusCurried se invoca solo en 1 argumento, y el resultado es algo que puede vincularse a una variable y luego invocarse en otro argumento. La razón por la que estás pensando en currying como un concepto de programación funcional es que ve el mayor uso en lenguajes funcionales cuya sintaxis tiene aplicación por adyacencia, porque en esa sintaxis el currying se vuelve muy natural. Las aplicaciones de plusCurried y plusUncurried para definir four y five en la sintaxis Haskellish se fusionan para volverse completamente indistinguibles, por lo que puede simplemente tener todas las funciones completamente currificadas siempre (es decir, que cada función sea función de exactamente un argumento, solo algunas de ellas devolver otras funciones que luego se pueden aplicar a más argumentos). Mientras que en la sintaxis Cish con la aplicación por listas de argumentos entre paréntesis, las definiciones de four y five se ven completamente diferentes, por lo que debe distinguir entre plusCurried y plusUncurried. Además, los lenguajes imperativos que llevaron a los lenguajes orientados a objetos de hoy (y algunos de los actuales lenguajes orientados a objetos) nunca tuvieron la capacidad de vincular funciones a variables o pasarlas a otras funciones (esto se conoce como tener funciones de primera clase), y sin esa facilidad no hay nada que pueda realmente hacer con una función curried que no sea invocarla en todos los argumentos, y por lo tanto no tiene sentido tenerlos.

El término currying también se refiere al proceso de convertir una función de múltiples argumentos en uno que toma un solo argumento y devuelve otra función (que toma un solo argumento, y puede devolver otra función que ...), y " "desorden" puede referirse al proceso de hacer la conversión inversa.


La sobrecarga no es un concepto relacionado. Sobrecargar un nombre significa dar múltiples definiciones con diferentes características (tipos de argumento, número de argumentos, tipo de retorno, etc.) y hacer que el compilador resuelva qué definición significa una apariencia dada del nombre por el contexto en el que aparece.

Un ejemplo bastante obvio de esto es que podríamos definir plus añadir números enteros, sino también utilizar el mismo nombre plus para añadir números de punto flotante, y potencialmente podríamos utilizarlo para concatenar cadenas, matrices, listas, etc, o para agregar vectores o matrices. Todos estos tienen implementaciones muy diferentes que no tienen nada que ver entre sí en cuanto a la implementación del lenguaje, pero damos el mismo nombre. El compilador es responsable de averiguar que plus stringA stringB debe llamar a la cadena plus (y devolver una cadena), mientras que plus intX intY debe llamar al número entero plus (y devolver un número entero).

Una vez más, no hay ninguna razón inherente por la cual este concepto sea un "concepto OO" en lugar de un concepto de programación funcional. Simplemente sucedió que encajaba con naturalidad en los lenguajes orientados a objetos de tipo estático que se desarrollaron; si ya está resolviendo qué método invocar por el objeto en el que se invoca el método, entonces es un pequeño tramo para permitir una sobrecarga más general.La sobrecarga completamente ad-hoc (donde no hace más que definir el mismo nombre varias veces y confiar en el compilador para resolverlo) no encaja tan bien en los idiomas con funciones de primera clase, porque cuando pasa el nombre sobrecargado como función en sí no tiene el contexto de llamada para ayudarlo a determinar qué definición es la intención (y los programadores pueden confundirse si lo que realmente querían era pasar las definiciones sobrecargadas). Haskell desarrolló clases de tipos como una forma más principista de usar la sobrecarga; estos efectivamente do le permiten pasar todas las definiciones sobrecargadas a la vez, y también permiten que el sistema de tipo exprese tipos un poco como "cualquier tipo para el cual se definen las funciones f y g".


En resumen:

  • currificación y la sobrecarga son completamente ajenos
  • currificación se trata de la aplicación de funciones a un menor número de argumentos que se requieren con el fin de obtener una función de los argumentos restantes
  • sobrecarga se trata de proporcionar múltiples definiciones para el mismo nombre y hacer que el compilador seleccione qué definición se usa cada vez que se usa el nombre
  • neit su currying y overloading son específicos de la programación funcional o de la programación orientada a objetos; cada uno de ellos simplemente está más extendido en lenguajes históricos de un tipo u otro debido a la forma en que se desarrollaron los lenguajes, haciéndolos más útiles o más obvios en un tipo de lenguaje
+0

Muy bien explicado, muchas gracias ... Creo que estoy empezando a comprender ahora. –

11

No hay, son completamente no relacionada y disímiles.

Overloading es una técnica para permitir que el mismo código para ser utilizado en diferentes tipos - a menudo conocidos en la programación funcional como polimorfismo (de varias formas).

Una función polimórfica:

map :: (a -> b) -> [a] -> [b] 
map f []  = [] 
map f (x:xs) = f x : map f xs 

Aquí, map es una función que opera en ninguna lista. Es polimórfico: funciona igual de bien con una lista de Int como una lista de árboles de hashtables. También es de orden superior, ya que es una función que toma una función como argumento.

Currying es la transformación de una función que toma una estructura de n argumentos, en una cadena de funciones que toman cada uno un argumento.

En los idiomas curried, puede aplicar cualquier función a algunos de sus argumentos, produciendo una función que toma el resto de los argumentos. La función parcialmente aplicada es un cierre.

Y puede transformar una función al curry en una no corregida (y viceversa) mediante la aplicación de la transformación inventada por Curry y Schonfinkel.

curry :: ((a, b) -> c) -> a -> b -> c 
    -- curry converts an uncurried function to a curried function. 

uncurry :: (a -> b -> c) -> (a, b) -> c 
    -- uncurry converts a curried function to a function on pairs. 
+0

mmm por lo que quiere decir que currar es más que simplemente eliminar (o cambiar) los parámetros de un método? Me refiero conceptualmente –

+4

@MarcelodeAguiar Decir que es más que eso implicaría que incluye eso. No es así Es algo completamente ajeno, tal como dijo Don. – sepp2k

1

La sobrecarga tiene varias funciones con el mismo nombre, con diferentes parámetros.

Currying es donde puede tomar múltiples parámetros y configurar selectivamente algunos, por lo que puede tener una sola variable, por ejemplo.

Por lo tanto, si tiene una función de representación gráfica en 3 dimensiones, puede tener: justgraphit(double[] x, double[] y, double[] z), y desea graficarla.

Al currying, puede tener: var fx = justgraphit(xlist)(y)(z) donde ahora ha configurado fx para que ahora tenga dos variables.

Luego, más adelante, el usuario escoge otro eje (fecha) y establecer que la Y, por lo que ahora tiene: var fy = fx(ylist)(z)

Luego, más tarde se hace un gráfico la información con sólo un bucle sobre algunos datos y el único la variabilidad es el parámetro z.

Esto hace que las funciones complicadas sean más simples ya que no tiene que seguir pasando las variables establecidas en gran medida, por lo que aumenta la legibilidad.

Cuestiones relacionadas