2011-08-19 13 views
15

Nota: saltare fino a "domanda" di seguito, se si vuole solo saltare contestoFunzioni Quando destinare in Applied

Quando dando colloqui sulla Scala ho praticamente do "problemi giocattolo", come quella qui sotto come esempi di funzioni parzialmente applicate.

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

Questo esempio aiuta, ma è difficile per me spiegare un generale "questo è quando si sarebbe riconoscere quando utilizzare una funzione parzialmente applicata".

Domanda: Qualcuno ha il proprio modo di spiegare con successo le Funzioni parzialmente applicate che colpisce davvero a casa per gli sviluppatori Java (o altri linguaggi OO)?

risposta

25

Supponiamo di voler applicare l'imposta sulle vendite.

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

Ora supponiamo di voler fare un sacco di acquisti a New York.

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

Si ottiene il massimo riutilizzo del codice dal metodo originale, ma la convenienza massima per le operazioni ripetitive per non dover specificare i parametri che sono (a livello locale) sempre lo stesso.

Le persone spesso cercano di risolvere questo con impliciti invece:

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

Non farlo! (Non senza un'attenta considerazione.) È difficile tenere traccia di quale valga implicita si trova in quel momento. Con le funzioni parzialmente applicate, ottieni gli stessi risparmi di digitazione, oltre a sapere quale stai utilizzando perché digiti il ​​nome ogni volta che lo usi!

+0

Ahhh Ho potuto vedere che davvero ridurre il numero di funzioni "sovraccariche" che avresti bisogno di definire anche. Grazie. – ThaDon

+0

ho appena finito di leggere le funzioni parzialmente applicate e mi chiedevo in quale possibile scenario lo userò ed eccolo .. +1 per una spiegazione eccellente – Sikorski

8

In Java si passano spesso i primi (o più) argomenti di una funzione parzialmente applicata al costruttore di una classe. L'esempio di Rex potrebbe quindi cercare qualcosa di simile:

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

immagino Scala ha la funzione di composizione, questo è qualcosa in cui brillano le funzioni parzialmente applicate.

luogo sono funzioni di ordine superiore come filter che prendono un predicato, e il loro uso come in:

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

Il predicato spesso una certa funzione parzialmente applicata. Stesse riserve per map, fold ecc.

Problemi correlati