Dada la siguiente función f con dos argumentos, ¿cuál es la forma estándar para aplicar Mapa solamente x?
una pequeña discusión sobre el pellejo y la aplicación parcial
En términos de PF, su función es f
"uncurried" - si bien conceptualmente toma dos argumentos, que están agrupados en una sola estructura del producto. En Python, todo está desordenado, todo el tiempo. Tienes que dar todos los argumentos a la vez, o ninguno de ellos.
Para solucionar esto, hay varios trucos, pero conceptualmente solo quieres "curry" la función. Es decir, transforma f(x,y)
en f(x)
que devuelve una nueva función g(y)
.
En las lenguas que están al curry por defecto, se puede escribir esta traducción fácilmente como:
-- curry: take a function from (x,y) to one from x to a function from y to z
curry :: ((x,y) -> z) -> (x -> y -> z)
curry f x y = f (x, y)
Así curry
quita el curry f
y sus argumentos de productos, por separado, y aplica los argumentos una vez que están todos disponibles. Lo contrario también es bastante fácil:
uncurry :: (x -> y -> z) -> ((x,y) -> z)
uncurry f (x,y) = f x y
¿Cómo se relaciona esto con la aplicación parcial?
- Currying realiza una función que toma una estructura de (n -producto) argumento, y devuelve una nueva función de tomar n argumentos.
- Aplicación parcial toma una función de n argumentos y las aplica a k argumentos, produciendo una función de n-k argumentos restantes.
En un idioma no utilizado, cada uno de los argumentos se puede aplicar sucesivamente (por ejemplo, parcialmente, con respecto a la aridad de la función). En un lenguaje al curry, debe jugar algunos trucos para deshacer la función primero, como en los ejemplos anteriores.
Creo que es más flexible estar en un entorno currículo por defecto, ya que la aplicación parcial es gratuita. En dicho entorno, es común encadenar funciones que modify a data structure into a pipeline. P.ej. una tubería de modificaciones enteros:
(+1) . (*2) . (^3) $ 7
es sólo una cadena de aplicadas parcialmente, funciones uncurried, integrado, operando cada uno en la salida de la función anterior. Esto puede ser bueno, ya que separa las preocupaciones visualmente.
¿Puede comentar cómo se compara el rendimiento de estos tres métodos? – chase
@chase Bien, el último no implica ninguna aplicación parcial real, por lo que evita cualquier sobrecarga. En cuanto a los otros dos, no puedo decirlo. Este tipo de micro-optimización no debería ocurrir hasta que identifiques un punto de acceso de todos modos. – Marcin
Generalmente estoy de acuerdo. Aunque de vez en cuando uno busca las preguntas SO de 2 años cuando encuentran un punto clave;) Debería ser lo suficientemente fácil para hacer un perfil, aunque personalmente prefiero la última solución para mayor claridad. – chase