it-roy-ru.com

Как я должен думать о классах продуктов Scala?

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

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

Product4 is a cartesian product of 4 components

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

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

55
mtnygard

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

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

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

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

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

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

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

28
Daniel C. Sobral

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

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

(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

47
oxbow_lakes

От эта тема :

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

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

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

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

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

7
VonC

Декартово произведение есть произведение множеств. Для заданных множеств 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 - компоненты.

4
Thom Smith

Я думаю, что кто-то может запутаться, потому что 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, мы рассматриваем класс как результат Cartesian Product of (String, Int, Double), поэтому вы знаете, что теперь вы можете использовать _1_2_3method.

0
Norman Bai