13

関数型プログラミングでカリー化がどのように機能するかを理解しようとしています。私はwikiとSOで同じことについていくつかの質問をしました。

ラムダ (カリー化) を理解するのに助けが必要

「カレー」とは?

カリー化とは、n 個の引数を取る関数を、それぞれ 1 個の引数を持つ n 以下の関数に分割することだと理解しています。私は理論的には理解していますが、同じことをコーディングしている間は点をつなぐことができません。おそらく、関数型プログラミング言語または C# に関する知識が不足している可能性があります (上記の質問の多くの回答が扱っているように)。

とにかく、私はgroovyとJavaを理解しています。add(a,b)そこで、groovyの標準機能の概要をつかもうとしたのですが、できませんでした。

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

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

Groovy クロージャーを使用したカリー化を理解するのを手伝ってくれる人はいますか?

4

2 に答える 2

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

ただし、jalopabaで示されているように、組み込みのGroovycurryメソッドを使用する方が適切です。(右からカレーするカレーとカレーもありそれぞれ所定の位置にあります)

Groovyカレーの方法は、単一のパラメーターのみを必要とするクロージャにたどり着く必要がないため、部分適用の場合であるため、誤った名称であると言わなければなりません。

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

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

def partial = addAndTimes.curry( 1 )

println partial( 2, 3 ) // 9
于 2012-05-09T08:33:11.407 に答える
11

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!
于 2012-05-09T07:47:55.230 に答える