2011-08-19 8 views
15

Nota: saltar hacia abajo para "pregunta" a continuación si desea saltar el contextoFunciones Cuando a utilizar parcialmente aplicadas

Al dar charlas sobre Scala yo más o menos dar "problemas de juguete" como la 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 

En este ejemplo no ayuda, sin embargo, es difícil para mí explicar un general "esto es cuando se podría reconocer cuándo utilizar una función parcialmente aplicada".

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

Respuesta

25

Supongamos que desea aplicar el impuesto a las ventas.

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

Supongamos que quiere hacer muchas compras en Nueva York.

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

Usted recibe la reutilización de código máxima del método original, sin embargo, la comodidad máxima para las tareas repetitivas al no tener que especificar los parámetros que son (a nivel local) siempre es el mismo.

personas a menudo tratan de resolver esto con implícitos en su lugar:

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

No practico! (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.

+0

Ahhh Pude ver que realmente se reducía el número de funciones "sobrecargadas" que también necesitaría definir. Gracias. – ThaDon

+0

Acabo de leer funciones parcialmente aplicadas y me preguntaba en qué posible escenario lo usaré y aquí está ... +1 para una explicación excelente – Sikorski

8

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 luego mirar algo como esto:

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")) 
1

supongo Scala tiene la composición de funciones, esto es algo en donde brillan las funciones aplicadas parcialmente.

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

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

El predicado es a menudo alguna función aplicado parcialmente. Lo mismo vale para map, fold etc.

Cuestiones relacionadas