包“scala”包含许多名为Product,Product1,Product2等的类,最多为Product22。
这些类的描述肯定是准确的。例如:
Product4 is a cartesian product of 4 components
准确,是的。交际?没那么多。我希望这对于已经理解在这里使用的“笛卡儿产品”感的人来说是完美的措辞。对于没有的人来说,这听起来有点循环。 “哦,是的,当然,Product4是4个 mumble-mumbles 的 mumble 产品。”
请帮助我理解正确的功能语言观点。这里使用的“笛卡尔积”是什么意思?产品类的“投影”成员表示什么?
答案 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."
也许通过了解谁从中获得更好的理解:
直接已知子类: 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
现在的方法。