Vraag Wanneer moet u gedeeltelijk toegepaste functies gebruiken [gesloten]


Notitie: spring naar "Vraag" hieronder als u alleen de context wilt overslaan

Bij het geven van lezingen over Scala geef ik vrijwel "speelgoedproblemen" zoals hieronder, voorbeelden van gedeeltelijk toegepaste functies.

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

Dit voorbeeld helpt echter, maar het is moeilijk voor mij om een ​​algemene uitleg te geven. "Dit is wanneer je zou herkennen wanneer een gedeeltelijk toegepaste functie moet worden gebruikt".

Vraag: Iedereen heeft zijn eigen manier om gedeeltelijk gedeeltelijk toegepaste functies uit te leggen die echt thuiskomen bij Java- (of andere OO-taal) ontwikkelaars?


15
2017-08-19 17:54


oorsprong


antwoorden:


Stel dat u omzetbelasting wilt toepassen.

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

Stel nu dat je een heleboel aankopen wilt doen in New York.

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

U krijgt maximaal hergebruik van code van de oorspronkelijke methode, maar maximaal gemak voor repetitieve taken door niet de parameters te hoeven opgeven die (lokaal) altijd hetzelfde zijn.

Mensen proberen dit vaak met impliciete oplossingen op te lossen:

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

Doe het niet! (Niet zonder zorgvuldige afweging.) Het is moeilijk om bij te houden welke impliciete val er op dat moment is. Met gedeeltelijk toegepaste functies, krijg je dezelfde besparing van typen, plus je weet welke je gebruikt omdat je de naam typt elke keer dat je hem gebruikt!


25
2017-08-19 18:15



In Java geef je vaak de eerste (of meer) argumenten van een gedeeltelijk toegepaste functie door aan de constructor van een klasse. Het voorbeeld van Rex ziet er dan ongeveer zo uit:

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

8
2017-08-19 19:19



Ik denk dat Scala functies heeft, dit is iets waar deels toegepaste functies op lijken.

Een ander punt zijn hogere orde functies zoals filter die een predikaat hebben, en hun gebruik zoals in:

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

Het predicaat is vaak een gedeeltelijk toegepaste functie. Hetzelfde geldt voor map, fold enz.


1
2017-07-08 18:26