2011-08-19 25 views
15

Not: Sadece içerik-atlamak istiyorsanız aşağıdaki aşağı "Soru" atlamakKısmen Uygulanan kullanmak için Fonksiyonlar

Scala ilgili müzakereleri verirken ben çok fazla olarak aşağıdaki gibi "oyuncak sorunları" vermek Kısmen Uygulamalı Fonksiyonların örnekleri. Bana genel açıklamak için Bu örnek yardımcı olur

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

, ancak "bu kısmen uygulanan işlevini kullanmak tanıyacağınız ediyorum ne zaman olduğunu" zor.

Soru: Herkes, Java (veya diğer OO dili geliştiricileri) için gerçekten işe yarayan Kısmen Uygulamalı İşlevleri kendi başlarına açıklamak için kendi yöntemlerine sahip midir?

cevap

25

Satış vergisi uygulamak istediğinizi varsayalım.

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

Şimdi, New York'ta bir sürü satın alım yapmak istediğinizi varsayalım.

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

Sen (yerel) her zaman aynı parametreleri belirtmek zorunda vermeyerek tekrarlayan görevler için orijinal yönteminden maksimum kodu yeniden, henüz maksimal kolaylık olsun.

İnsanlar genelde yerine implicits ile bu çözmeye:

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

Yapmayın! (Dikkatli düşünmeden olmaz.) O sırada hangi örtük valfin bulunduğunu takip etmek zor. Kısmen uygulanan işlevlerle, aynı yazma tasarrufunu elde edersiniz, artı kullandığınız herşeyi biliyorsunuz, çünkü her kullandığınızda adı yazıyorsunuz!

+0

Ahhh Bunu da tanımlamanız gereken "aşırı yüklenmiş" işlevlerin sayısını azaltmayı görebiliyordum. Teşekkürler. – ThaDon

+0

Kısmen uygulamalı fonksiyonları okumayı yeni bitirdim ve kullanacağım senaryoyu merak ediyorum ve işte burada .. .. mükemmel bir açıklama için +1 – Sikorski

8

Java'da, kısmi olarak uygulanan bir işlevin ilk (veya daha fazla) argümanını bir sınıfın yapıcısına sıklıkla geçirirsiniz. Rex'in örnek sonra böyle görünebilir:

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

Ben Scala işlevi bileşimine sahiptir tahmin bu kısmen uygulanan fonksiyonlar parlayacak bir şeydir.

Başka bir nokta gibi bir yüklemi alır filter ve bunların kullanımı gibi yüksek sıralı işlevler şunlardır:

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

yüklem genellikle bazı kısmi bir şekilde tatbik fonksiyonudur. Aynı durum map, fold vb için de geçerlidir.

İlgili konular