Как я должен думать о классах продуктов Scala? - PullRequest
56 голосов
/ 19 августа 2009

Пакет "scala" имеет несколько классов: Product, Product1, Product2 и т. Д., Вплоть до Product22.

Описания этих классов, безусловно, точны. Например:

Product4 is a cartesian product of 4 components

Точно, да. Коммуникативная? Не так много. Я ожидаю, что это идеальная формулировка для того, кто уже понимает, что здесь используется термин «декартово произведение». Для тех, кто этого не делает, это звучит немного круто. «О, да, конечно, Product4 - это бормотание произведение 4 бормотание

Пожалуйста, помогите мне понять правильную точку зрения функционального языка. В чем смысл использования «декартового произведения»? Что обозначают члены «проекции» классов Product?

Ответы [ 5 ]

49 голосов
/ 20 августа 2009

Все остальные пошли на математику, поэтому я пойду на глупый ответ на всякий случай! У вас есть простая машина с коробкой передач, рулем, акселератором и несколькими пассажирами. Каждый из них может варьироваться: на каком оборудовании вы находитесь, каким способом вы управляете, ваша нога "на полу" и т. Д. Поэтому коробка передач, рулевое управление, акселератор и т. Д. Являются переменными и у каждого есть свой набор возможных значений.

Декартово произведение каждого из этих наборов - это, в основном, все возможные состояния, что ваш автомобиль может находиться в . Итак, несколько возможных значений:

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

размер декартового произведения - это, конечно, произведение (умножение) возможностей каждого множества. следовательно, если ваш автомобиль имеет 5 передач (+ задний ход + нейтраль), рулевое управление влево / вправо / влево, акселератор включен / выключен и может обслуживать до 4 пассажиров, тогда возможны 7 x 3 x 2 x 4 или 168 возможных состояний.

Этот последний факт является причиной того, что декартово произведение (кстати, названное в честь Рене Декарта ) имеет символ умножения x

28 голосов
/ 19 августа 2009

"Набор всех возможных пар элементов, компоненты которых являются членами двух наборов."

"В частности, декартово произведение двух множеств X (например, точек на оси x) и Y (например, точек на оси y), обозначенных X × Y, представляет собой множество все возможные упорядоченные пары, первый компонент которых является элементом X, а второй компонент - элементом Y (например, вся плоскость xy) "

Возможно, лучшее понимание можно получить, зная, кто из него вытекает:

Прямые известные подклассы: Tuple4

Или, зная, что « расширяет продукт », узнайте, какие другие классы могут использовать его, благодаря расширению самого Product. Я не буду здесь это цитировать, потому что это довольно долго.

В любом случае, если у вас есть типы A, B, C и D, тогда Product4 [A, B, C, D] - это класс, экземплярами которого являются все возможные элементы декартового произведения A, B, C и D. В буквальном смысле.

За исключением, конечно, того, что Product4 - это Черта, а не класс. Он просто предоставляет несколько полезных методов для классов, которые являются декартовыми произведениями четырех различных множеств.

7 голосов
/ 19 августа 2009

От этой темы :

Из математики декартово произведение двух множеств A, B обозначается как AxB, а его элементы (a, b), где a в A и b в B.

Для трех наборов элементами (декартового) произведения являются (a, b, c) и т. Д. *

Итак, у вас есть кортежи элементов, и вы действительно можете видеть в библиотеке Scala, что все кортежи (как Tuple1) наследуют соответствующую характеристику продукта (как Product1).

Думайте о товаре как об абстракции, а соответствующий кортеж - о конкретном представлении .

Проекция позволяет получить экземпляр класса 'n', на который ссылается Продукт.

4 голосов
/ 19 августа 2009

Декартово произведение есть произведение множеств. Для заданных множеств A и B A x B («крестик B») - это набор всех кортежей (x, y), таких, что x находится в A, а y - в B. Декартово произведение может быть аналогично определено для типов: типы A и B, A x B - это тип кортежей (x, y), где x имеет тип A, а y имеет тип B.

Итак, Product4 - это тип кортежей (w, x, y, z), где w, x, y, z - компоненты.

0 голосов
/ 11 февраля 2019

Я думаю, что кто-то может запутаться из-за того, что Product работает как член-итератор, точно так же, как я.

На самом деле, я думаю, что в 2019 году все знают, что такое декартово произведение . Но где декартово произведение в кортеже? Я знаю, что если у нас есть {a, b, c} и {1,2,3}, мы получим {a, 1}, {a, 2} ... {c, 3}. Но когда мы сталкиваемся с Tuple2 (a, 1), у нас просто есть (a, 1), как один объект может возражать?

Итак, давайте рассматривать классы, которые реализуют Product, как объявления. Если класс A (String, Int, Double) реализует Product3, мы рассматриваем класс как результат декартового произведения из (String, Int, Double), таким образом, вы знаете, что можете использовать _1 _2 _3 метод сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...