tutorial programming learn koans functional exercises codecademy app scala functional-programming

scala - programming - Cuándo usar las funciones parcialmente aplicadas



scala programming (3)

En Java a menudo se pasan los primeros (o más) argumentos de una función parcialmente aplicada al constructor de una clase. El ejemplo de Rex podría verse más o menos así:

class TaxProvider { final String state; TaxProvider(String state) { this.state = state; } double getTaxedCost(double cost) { return ... // look up tax for state and apply to cost } } TaxProvider locallyTaxed = new TaxProvider("NY") double costOfApples = locallyTaxed.getTaxedCost(price("apples"))

Nota : salte a "Pregunta" a continuación si solo desea omitir el contexto

Al dar charlas sobre Scala, casi doy "problemas de juguete" como el de abajo como ejemplos de Funciones Parcialmente Aplicadas.

def multiply(x:Int, y:Int): Int = x * y val x5 = multiply(5, _:Int) x5(10) //produces 50

Este ejemplo ayuda, sin embargo, es difícil para mí explicar un general "aquí es cuando reconocerías cuándo usar una función parcialmente aplicada".

Pregunta : ¿Alguien tiene su propia forma de explicar con éxito las funciones parcialmente aplicadas que realmente da en el blanco para los desarrolladores de Java (u otros lenguajes de OO)?


Supongamos que desea aplicar el impuesto a las ventas.

def withTax(cost: Float, state: String) = { /* Some complicated lookup table */ }

Ahora supongamos que quiere hacer muchas compras en Nueva York.

val locallyTaxed = withTax(_: Float, "NY") val costOfApples = locallyTaxed(price("apples"))

Obtiene la máxima reutilización del código del método original, pero la máxima conveniencia para las tareas repetitivas al no tener que especificar los parámetros que (localmente) siempre son los mismos.

La gente a menudo trata de resolver esto con implícitas en su lugar:

def withTax(cost: Float)(implicit val state: String) = ...

No lo hagas! (No sin una cuidadosa consideración.) Es difícil hacer un seguimiento de qué val implícito está disponible en ese momento. Con funciones parcialmente aplicadas, obtienes los mismos ahorros de tipeo, además sabes cuál usas porque escribes el nombre cada vez que lo utilizas.


Supongo que Scala tiene composición de funciones, esto es algo donde brillan las funciones parcialmente aplicadas.

Otro punto son las funciones de orden superior como filter que toma un predicado y su uso como en:

filter (<42) list -- sorry, don''t speak Scala

El predicado es a menudo una función parcialmente aplicada. Lo mismo vale para el map , el fold , etc.