web-dev-qa-db-ja.com

Scalaの製品クラスについてどのように考えるべきですか?

パッケージ「scala」には、Product22まで、Product、Product1、Product2などの名前のクラスがいくつかあります。

これらのクラスの説明は確かに正確です。例えば:

Product4 is a cartesian product of 4 components

正確です、はい。コミュニケーション?それほど多くはありません。ここで使われている「デカルト積」の感覚をすでに理解している人にとっては、これが完璧な表現だと思います。そうでない人にとっては、それは少し循環的に聞こえます。 「もちろん、Product4はmumble 4の積mumble-mumblesです。」

正しい関数型言語の視点を理解するのを手伝ってください。ここで使われている「デカルト積」の意味は何ですか?製品クラスの「プロジェクション」メンバーは何を示していますか?

58
mtnygard

"コンポーネントが2つのセットのメンバーである要素のすべての可能なペアのセット。"

"具体的には、X×Yで表される2つのセットX(たとえば、x軸上の点)とY(たとえば、y軸上の点)のデカルト積は、すべての可能なセットです。最初のコンポーネントがXのメンバーであり、2番目のコンポーネントがYのメンバーである順序対(たとえば、xy平面全体) "

おそらく、誰がそれから派生したのかを知ることによって、より良い理解を得ることができます。

直接既知のサブクラス:Tuple4

または、「extends Product」とわかっている場合は、Product自体を拡張することで、他のクラスがそれを利用できることを知っています。ただし、かなり長いので、ここでは引用しません。

とにかく、タイプA、B、C、およびDがある場合、Product4 [A、B、C、D]は、インスタンスがA、B、C、およびDのデカルト積のすべての可能な要素であるクラスです。文字通り。

もちろん、Product4がTraitであり、クラスではないことを除いて。これは、4つの異なるセットのデカルト積であるクラスにいくつかの便利なメソッドを提供するだけです。

29

他のみんなは数学に行ったので、念のために愚かな答えに行きます!あなたはギアボックス、ハンドル、加速器と多くの乗客を持っている単純な車を持っています。これらはそれぞれ異なります:どのギアを使用しているか、どちらの方向にステアリングしているか、「床に」足を置いているかなど。ギアボックス、ステアリング、したがって、アクセラレータなどは変数であり、それぞれに可能な値の独自のセットがあります。

これらの各セットのデカルト積は、基本的にあなたの車が入る可能性のあるすべての状態です。したがって、いくつかの可能な値は次のとおりです。

(gear,    steer,    accel,     pssngers)
--------|---------|----------|---------
(1st,     left,     foot down, none)
(neutral, straight, off,       the kids)

デカルト積のサイズは、もちろん、各セットの可能性の積(乗算)です。したがって、車に5つのギア(+リバース+ニュートラル)があり、ステアリングが左/ストレート/右、アクセルがオン/オフ、最大4人の乗客の場合、7 x 3 x 2 x4または168の可能な状態があります。

この最後の事実は、デカルト積(ちなみにRene Descartesにちなんで名付けられた)に乗算記号xがある理由です。

52
oxbow_lakes

デカルト積はセットの積です。与えられたセットAとB、A x B( "A cross B")は、xがAにあり、yがBにあるような、すべてのタプル(x、y)のセットです。デカルト積は、タイプで同様に定義できます。タイプAおよびB、A x Bはタプル(x、y)のタイプです。ここで、xはタイプA、yはタイプBです。

したがって、Product4はタプルのタイプ(w、x、y、z)であり、w、x、y、zはコンポーネントです。

4
Thom Smith

Productは、私と同じように、メンバーのイテレータのように機能するため、誰かが混乱していると感じるかもしれません。

実際、2019年には、デカルト積が何であるかを誰もが知っていると思います。しかし、タプルのデカルト積はどこにありますか? {a、b、c}と{1,2,3}がある場合、{a、1}、{a、2} ... {c、3}を取得します。しかし、Tuple2(a、1)に出くわしたとき、(a、1)だけがありますが、どのようにして1つのオブジェクトProductを使用できますか?

それでは、Productを実装するクラスを宣言として扱いましょう。クラスA(String、Int、Double)の実装Product3の場合、クラスは(String、Int、Double)のCartesian Productの結果として扱われるため、_1を使用できることがわかります。 _2_3methodnow。

0
Norman Bai