【问题标题】:How should I think about Scala's Product classes?我应该如何看待 Scala 的产品类?
【发布时间】:2010-11-21 01:48:54
【问题描述】:

“scala”包有许多名为 Product、Product1、Product2 等的类,直到 Product22。

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

Product4 is a cartesian product of 4 components

准确,是的。交际?没那么多。我希望对于已经理解这里使用的“笛卡尔积”意义的人来说,这是一个完美的措辞。对于不知道的人来说,这听起来有点循环。 “哦,是的,当然 Product4 是 4 个 mumble-mumblesmumble 乘积。”

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

【问题讨论】:

    标签: scala functional-programming


    【解决方案1】:

    来自this thread

    从数学上看,两个集合 A、B 的笛卡尔积表示为 AxB,其元素为 (a, b),其中 a 在 A 中,b 在 B 中。

    对于三个集合,(笛卡尔)乘积的元素是(a, b, c)等等...

    因此,您有元素的元组,并且确实可以在 Scala 库中看到所有元组(如 Tuple1)都继承了各自的产品特征(如 Product1)。

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

    投影允许获取 Product 引用的“n”类的实例。

    【讨论】:

      【解决方案2】:

      "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 本身,了解其他类可以使用它。不过,我不会在这里引用它,因为它相当长。

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

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

      【讨论】:

      • 请务必谈论“或者,知道它“扩展了产品”,知道其他类可以利用它,凭借扩展产品本身。“即使它很长。人们会欣赏它。
      • @user319058 转到here,点击“已知子类”,玩得开心。
      • 这个答案不是漏掉了两个关键的东西吗?排序,并允许相同类型的两个实例?乘法是关联的,因此多个元素的顺序并不重要。然而,Product 中元素的排序使其不具有关联性。一个集合在技术上减少了等价的元素。因此,拥有Int 两次就说明了集合的概念。对于这种抽象,还有比“产品”和“集合”更准确的术语吗?
      • @chaotic3quilibrium 我认为您的意思是可交换的,而不是关联的。无论如何,笛卡尔积是neither associative, nor commutative
      • 我的意思是可交换的。我的错。你是对的。这是维基百科上断言的地方:en.m.wikipedia.org/wiki/Cartesian_product?wprov=sfla1
      【解决方案3】:

      笛卡尔积是集合的乘积。给定集合 A 和 B,A x B ("A cross 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】:

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

        的原因

        【讨论】:

        • 我个人觉得数学解释要简单得多!
        【解决方案5】:

        我想有人可能会对 Product 感到困惑,就像我所做的那样,它就像一个成员迭代器。

        事实上,我认为在 2019 年,每个人都知道什么是笛卡尔积。但是元组中的笛卡尔积在哪里?我知道如果我们有 {a,b,c} 和 {1,2,3} 我们会得到 {a,1},{a,2}...{c,3}。但是当我们遇到 Tuple2(a,1) 我们只有 (a,1) 时,怎么会有一个对象 Product 呢?

        所以让我们将实现Product 的类视为声明。如果类 A(String, Int, Double) 实现 Product3 ,我们将该类视为 (String, Int, Double) 的 笛卡尔积 的结果,因此您知道您可以使用 _1 @987654324 @_3现在的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-10
          • 2013-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多