回答:
オブジェクト指向言語でのメソッドチェーンは、カリー化とは少し異なります。定義、カリー化の結果は、元のより制限された形で機能。規則、方法チェーンの結果は、元の(通常、非機能)の修飾された形態であるオブジェクト。メソッドチェーンは、同じクラスの無関係なメソッドで使用できますが、カリー化には、元の関数の1つ以上のパラメーターが固定されている(所定の)関数を返すことが含まれます。
Javaでは、メソッドチェーンは次のようになります。
String myString = new StringBuilder("Hi ").append(firstName)
.append(" ")
.append(lastName)
.append("!")
.toString();
そのため、これらの.append()メソッド呼び出しはそれぞれ、匿名のStringBuilderオブジェクトへのポインターを返します。このオブジェクトは、各.append()の後に完了し、関数ではありません。
対照的に、Scalaでは、部分適用またはカリー化は次のようになります。
def simple(x:Int, y:Int, z:Int) = x * (y + z)
val simpler = simple(2, _:Int, _:Int)
simpler(3, 4) => 14
(Daniel Yankowskyのブログからのサンプル)
simpler()
この例のは、のラッパー関数ですsimple()
。 simpler()
は、それ自体のより限定されたバージョン以外のものに評価される前に、より多くのパラメーターを受け取る関数です。
編集: 1日後にこれを読んで、私は「ラッパー機能」が鍵だと思う。カリー化または部分的なアプリケーションは、ラッパーメソッドを使用してJavaで最適にシミュレートできます。
public interface Simpler {
public int apply(int y, int z);
}
public class Simple {
public int apply(int x, int y, int z) { return x * (y + z); }
public Simpler partiallyApply(final int x) {
final simple = this;
return new Simpler() {
@Override
public int apply(int y, int z) {
// x is the final int parameter to partiallyApply()
simple.apply(x, y, z);
}
}
}
}
:END-EDIT
メソッドチェーンは、部分的なアプリケーションまたはカリー化に似ていますが、他のメソッドを返すメソッド(ファンクターを検索)とのみ同等であり、カリー化または部分的なアプリケーションを有意にモデル化する戻り値の型でメソッドを設定する必要があります。
メソッドチェーンは、「ビルダー」デザインパターンとJava 8の新しいコレクションライブラリインターフェイスで行われるように、遅延評価などの実装によく使用されます。
それがお役に立てば幸いです。
toString()
呼び出しなしでは、呼び出しのカリー化の意図を効果的に複製していませんか?私はオブジェクト指向でカリー化の概念をまっすぐに取得しようとしています。
append(charSeq)
関数はカリー化形式でinsert(destOffset, charSeq)
機能destOffset
常にのStringBuilderの長さです。