2011-08-19 7 views
15

:あなただけのコンテキストにスキップしたい場合は、以下のダウン「質問」へジャンプ部分的に適用、使用する機能

スカラ座に関する協議を与えるとき、私はかなりのように以下のような「おもちゃの問題」を与えます部分適用関数の例私は一般的に説明するために、この例では、助けるん

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

は、しかし、それは「これは部分的に適用される機能を使用するときは、認識したいときである」タフです。

質問:誰でもJava(または他のOO言語)開発者のために実際に家に帰る部分的に応用された関数を説明する方法はありますか?

答えて

25

消費税を適用するとします。

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

ここで、ニューヨークでたくさんの購入をしたいとします。

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

あなたがいる(ローカル)は、常に同じパラメータを指定する必要がないため、反復的な作業のために、元の方法から最大のコードの再利用、まだ最大の利便性を得ることができます。

人々はしばしば代わりに、暗黙でこれを解決しよう:

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

それをしないでください! (慎重に考慮する必要はありません)その時点でどの暗黙のvalが発生したかを把握することは難しいです。部分的に適用された関数を使用すると、同じタイピングの節約が得られます。また、使用するたびに名前を入力するため、使用する文字を知ることができます。

+0

Ahh私は実際に定義する必要がある「オーバーロード」関数の数を減らすことができます。ありがとう。 – ThaDon

+0

私はちょうど部分的に適用された機能を読み終え、可能なシナリオで私はそれを使用するだろうと思っていたここにそれは..優れた説明 – Sikorski

8

Javaでは、部分的に適用された関数の最初(またはそれ以上)の引数をクラスのコンストラクタに渡すことがよくあります。レックスの例では、このようになります:

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

私はScalaは関数合成を持っていると思い、これは部分的に適用される機能を輝かものです。

もう一つのポイントは、のように述語を取るfilter、およびそれらの使用法などの高次機能です:

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

述語は、多くの場合、いくつかの部分的に適用される関数です。 mapfoldなど

関連する問題