2012-05-09 9 views
13

私は関数プログラミングでカリングがどのように機能するかを理解しようとしています。私はwikiに行って、同じことについての2つの質問をしました。groovyクロージャを使用してカレーを理解するのに役立つ必要がありますか?

Need help understanding lambda (currying)

What is 'Currying'?

私はカリー化は、すべて一つの引数ごとにn以下の機能の中にn個の引数を取る関数を分割程度であることを理解しています。私はそれを理論的に理解していますが、同じものをコーディングしながらドットを接続することはできません。多分、関数型プログラミング言語やC#の知識が不足しているかもしれません。

とにかく、私はグルーヴィー& javaを理解しています。だから私は標準add(a,b)の概要をgroovyで手に入れようとしましたが、私はそれを終了できませんでした。

def closure = { arg -> 
    // ?? 
} 

def add(anotherClosure , a){ 
    return closure // ?? 
} 

groovyクロージャを使用してカレーを理解するのに役立つ人はいますか?

+3

私は会議でGroovyを使ってFunctional Programmingについて話します。 [Groovyでカワリングに関するスライド](http://www.slideshare.net/arturoherrero/functional-programming-with-groovy/32) –

+0

すべてのスライドを調べました。非常に素晴らしい情報です。 :) –

答えて

17

はあなたが書き込みすることにより、独自のカリー化機能をロールバックすることができます別のクロージャーとカルトパラメーターを設定し、この値を使用するクロージャーを返すクロージャー。

// Our closure that takes 2 parameters and returns a String 
def greet = { greeting, person -> "$greeting $person" } 

// This takes a closure and a default parameter 
// And returns another closure that only requires the 
// missing parameter 
def currier = { fn, param -> 
    { person -> fn(param, person) } 
} 

// We can then call our currying closure 
def hi = currier(greet, 'Hi') 

// And test it out 
hi('Vamsi') 

しかし、あなたがより良い作り付けのGroovy curry方法as shown by jalopabaにこだわっています。それはあなたが必要としないようpartial applicationのより多くの場合のように、Groovyのカレー方法は誤った名称であることを、

それは指摘しておかなければ(また、右からカレー、それぞれ与えられた位置でrcurryncurryあります)

def addAndTimes = { a, b, c -> (a + b) * c } 

println addAndTimes(1, 2, 3) // 9 

def partial = addAndTimes.curry(1) 

println partial(2, 3) // 9 
+2

私よりはるかに包括的な説明のための+1 :-) – jalopaba

10

あなたがcurry()メソッドを使用して閉鎖インスタンスに1つ以上の引数のための固定値を設定することができます。

def add = { a, b -> a + b } 
def addFive = add.curry(5) 
addFive(3) // 5 + 3 = 8 

もう一つの例:

def greeter = { greeting, name -> println "${greeting}, ${name}!" } 
def sayHello = greeter.curry("Hello") 
sayHello("Vamsi") // Hello, Vamsi! 
def sayHi = greeter.curry("Hi") 
sayHi("Vamsi") // Hi, Vamsi! 
関連する問題