我应该如何看待Scala的产品类?

时间:2009-08-19 18:48:26

标签: scala functional-programming

包“scala”包含许多名为Product,Product1,Product2等的类,最多为Product22。

这些类的描述肯定是准确的。例如:

Product4 is a cartesian product of 4 components

准确,是的。交际?没那么多。我希望这对于已经理解在这里使用的“笛卡儿产品”感的人来说是完美的措辞。对于没有的人来说,这听起来有点循环。 “哦,是的,当然,Product4是4个 mumble-mumbles mumble 产品。”

请帮助我理解正确的功能语言观点。这里使用的“笛卡尔积”是什么意思?产品类的“投影”成员表示什么?

5 个答案:

答案 0 :(得分:48)

其他人都去了数学,所以为了以防万一,我会选择愚蠢的答案!你有一个简单的汽车,有一个变速箱,一个方向盘,一个加速器和一些乘客。每个都可以变化:你在哪个档位,你在哪个方向转向,你的脚“在地板上”等因此变速箱,转向,加速器等是变量并且每个都有自己的 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种可能状态。

最后一个事实是笛卡尔积(顺便提到 Rene Descartes )的乘法符号为x

的原因

答案 1 :(得分:28)

"The set of all possible pairs of elements whose components are members of two sets."

"Specifically, the Cartesian product of two sets X (for example the points on an x-axis) and Y (for example the points on a y-axis), denoted X × Y, is the set of all possible ordered pairs whose first component is a member of X and whose second component is a member of Y (e.g. the whole of the x-y plane)"

也许通过了解谁从中获得更好的理解:

直接已知子类: Tuple4

或者通过知道“扩展产品”,通过扩展Product本身,知道其他类可以使用它。我不会在这里引用它,因为它相当长。

无论如何,如果你有类型A,B,C和D,那么Product4 [A,B,C,D]是一个类,其实例是A,B,C和D的笛卡尔积的所有可能元素。字面上。

当然,除了Product4是Trait,而不是类。它只是为四个不同集合的笛卡尔积的类提供了一些有用的方法。

答案 2 :(得分:7)

来自this thread

  

从数学上看,两组A,B的笛卡尔乘积表示为AxB,其元素为(a, b),其中A中的a和B中的a。

     

对于三组,(笛卡儿)产品的元素是(a, b, c),依此类推......

     

所以,你有元素元组,实际上你可以在Scala库中看到所有元组(如Tuple1)都继承了相应的产品特征(如Product1)。

     

将产品视为抽象,将相应元组视为具体表示

投影允许获取产品引用的'n'类的实例。

答案 3 :(得分:4)

笛卡尔积是套装的产物。给定集A和B,A x B(“A交叉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 :(得分:0)

我认为有人可能对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现在的方法。