メソッドごとに1つのパラメーターのみを必要とする連鎖メソッドは、カリー化と同等ですか?


15

私は最近Rubyをいじくり回しており、純粋なオブジェクト指向言語(および純粋ではないものでも)で1つのパラメータのみを取り、連鎖するメソッドを作成することは、スタイル?そうでない場合は、なぜですか?この件に関する詳細かつ厳密な回答をいただければ幸いです。

回答:


14

オブジェクト指向言語でのメソッドチェーンは、カリー化とは少し異なります。定義、カリー化の結果は、元のより制限された形で機能規則、方法チェーンの結果は、元の(通常、非機能)の修飾された形態であるオブジェクト。メソッドチェーンは、同じクラスの無関係なメソッドで使用できますが、カリー化には、元の関数の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の新しいコレクションライブラリインターフェイスで行われるように、遅延評価などの実装によく使用されます

それがお役に立てば幸いです。


+1:私はそれを知っていましたが、あなたのように近くのどこでもそれを明確に表現できたとは思いません。
ピーターローウェル

わかりやすく説明すると、緑色のチェックマークとトラブルへの賛成票があります。
ワールドエンジニア

StringBuilderの非常に良い例についての質問- toString()呼び出しなしでは、呼び出しのカリー化の意図を効果的に複製していませんか?私はオブジェクト指向でカリー化の概念をまっすぐに取得しようとしています。
スリダールサルノバト

1
@ Sridhar-Sarnobatカリー化された関数は、パラメーターが少ない別の関数を返します。削除されたパラメーターは、返される関数で内部定数に変換されます。一部のオブジェクトはJava 8の関数のように扱われるため、混乱を招く可能性がありますが、StringBuilderはそれらの1つではありません。HMM、StringBuilderの内、append(charSeq)関数はカリー化形式でinsert(destOffset, charSeq)機能destOffset常にのStringBuilderの長さです。
グレンペターソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.