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

62 functional-programming scala

"scala"包有许多名为Product,Product1,Product2等的类,直到Product22.

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

Product4 is a cartesian product of 4 components
Run Code Online (Sandbox Code Playgroud)

准确,是的.交际?没那么多.我希望这对于已经理解在这里使用的"笛卡儿产品"感的人来说是完美的措辞.对于没有的人来说,这听起来有点循环."哦,是的,还有当然产品4是喃喃的4个产品咕哝,喃喃自语."

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

oxb*_*kes 52

其他人都去了数学,所以为了以防万一,我会选择愚蠢的答案!你有一个简单的汽车,有一个变速箱,一个方向盘,一个加速器和一些乘客.每个都可以变化:你在哪个档位,你在哪个方向转向,你的脚是"在地板上"等.变速箱,转向,加速器等因此是变量,每个都有自己的一可能的值.

每组中的笛卡尔积基本上都是您的汽车可能存在的所有状态.所以一些可能的值是:

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

笛卡尔积的大小当然是每组可能性的乘积(乘法).因此,如果你的车有5档(+倒档+空档),转向是左/直/右,加速器开/关和最多4名乘客,那么有7 x 3 x 2 x 4或168种可能的状态.

最后一个事实是笛卡尔积(顺便说一下Rene Descartes命名)具有乘法符号的原因x

  • 就个人而言,我发现数学解释更加简单! (7认同)

Dan*_*ral 31

"所有可能的元素对的集合,其组件是两个集合的成员."

"具体地,两组X的笛卡尔乘积(例如x轴上的点)和Y(例如y轴上的点),表示为X×Y,是所有可能的有序对的集合,其中第一组component是X的成员,其第二个成分是Y的成员(例如整个xy平面)"

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

直接已知子类:Tuple4

或者通过知道它" 扩展产品 ",通过扩展Product自身知道其他类可以利用它.我不会在这里引用它,因为它相当长.

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

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

  • @ user319058转到[这里](http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/index.html#scala.Product),点击"已知的子类",玩得开心. (2认同)

Von*_*onC 7

这个线程:

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

对于三组,(笛卡尔)产品的元素是(a, b, c)等等......

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

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

投影允许获取Product引用的'n'类的实例.