2012-03-17 8 views
-1

と呼ばれるプログラミング手法が、通常のコールバックインターフェイス(JavaのObserver/Observableインターフェイス、または従来のVisitorデザインパターンなど)とどのように違うかを理解しようとしています。function curryingと普通のコールバックメソッド

私はカレー化が何であるか理解していますが、独自の用語と言語サポートが必要な点でユニークな理由が分かりません。

誰かが、コールバック方式よりもカリングする方がよいプログラミング状況について説明できますか? curryingが各引数に別々の関数を使用するという事実の実際的な意義は何ですか?私は持っている答えを要約する:curryingは、関数が "ファーストクラス"の市民、つまり他のオブジェクト参照と同様に生成され、渡されるオブジェクトであるという事実に基づいています。これにより、関数から関数、つまりカリングを返すことができます。カリー化が有用である理由については

、カリー化はあなたが簡潔派生関数は、最小限の定型的なコードのオーバーヘッドを作成することができるように、関数呼び出し飾るようにする構文を提供します。 javaでは、すべてのパラメータを含むマスターメソッドを最終的に呼び出す各部分パラメータセットに対して、いくつかのオーバーロードされた「ラッパー」メソッドを作成することができますが、カリングは、コード内で必要に応じてこれらの「関数ラッパー」を生成できる、

+0

私はそれが(学問的な意味を除いて)より良いことを知らないが、それは問題の考え方の違いの一部に過ぎない。 curryingは、他の機能的なイディオムと共に、熟練したプログラマーが表現力を犠牲にせずにアイデアを簡潔に伝える方法を持っています。 – jpm

+0

これらの回答に投票、同意、またはコメントすることができます。 – Marcin

+0

@Marcin:私はカリングがコールバックができないことの例を尋ねてきました。まだそれを待っています... – Magnus

答えて

1

これは言語サポートのポイントです。 Javaでは、例えば、無計画なメソッド用のメソッド、引数の1つのメソッド用のメソッド、引数の2つのメソッド用のメソッドなど、あらゆる種類のコールバックインターフェイスを定義することができます。

しかし、関数がファーストクラスのcitiziensがあるwehn、1はこれを必要としません:関数が返すことができるので、単一の引数関数は、仕事を行います。

interface Fun<A,B> { 
    public B apply(A a); 
} 

またはそのようなこのパターンを説明します。したがって、すべての「機能のjava」プロジェクト内の1つの重要なインタフェースは、フォームのいくつかのインタフェースとなります。

1

カリングとコールバックは全く異なる2つのテクノロジです。

コールバックは基本的に「関数を関数に渡す」(つまり、関数を使用する高次関数)と同義です。カリングは、部分的なアプリケーションの一形態であり、すなわち、期待される全てのパラメータを渡さない関数は、空きパラメータだけを期待する新しい関数を返す。

したがって、それらはまったく別のものではありません。それははるかに簡単簡潔例えば、コールバック、またはpointfreeプログラムで、として使用することができる関数を作成することができますので、

カリー化に便利です。それは、あなたができることを意味します。 mapのような関数にコールバックを渡し、渡す気になるリストのすべての要素にコールバックを適用する新しい関数を持っています。

+0

これはまだ私にとって抽象的です。マップ内のすべての要素に対してコールバックを実行する部分的な関数を作成する機能は標準のVisitorパターンのように見えますが、Scalaの関数がファーストクラスのオブジェクトである方がやや簡単ですが、Javaの匿名クラスでも簡単にエミュレートできます。私は行方不明のものが他にありますか?並列パフォーマンスの影響、またはコンパイラテクニックの柔軟性? – Magnus

+0

@Magnus部分的に適用された関数は、コールバックを実行しません。あなたがそれを覚えるまでそれを繰り返します。 – Marcin

+0

@Magnusあなたは真剣に混乱しています。カレー化された(または部分的に適用された)関数とコールバックの間の接続はどう思いますか? – Marcin

関連する問題