代码之家  ›  专栏  ›  技术社区  ›  missingfaktor Kevin Wright

Scala中代码重用等数组语言

  •  3
  • missingfaktor Kevin Wright  · 技术社区  · 14 年前

    Array programming languages (也称为向量或多维语言)对标量进行泛化操作,以透明地应用于向量、矩阵和高维数组。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Rex Kerr    14 年前

    这是完全有可能的(我自己也这么做过),有适当的含蓄,尽管结果并不总是像一种从头开始设计的语言那样天衣无缝。

    例如,假设您希望将整数数组视为向量,并希望能够将它们相互相加和添加到标量中。你必须自己定义操作——Scala猜不出是什么 + 应该是在数组上。)也是好事,因为 * 在矩阵上通常没有明显的逐元素意义,当涉及到卷积时,它又意味着别的东西!)你可以

    class ArraysAdd(a: Array[Int]) {
      def +(i: Int) = a.map(_ + i)
      def +(b: Array[Int]) = {
        if (b.length==a.length) (a,b).zipped.map(_ + _).toArray
        else throw new IllegalArgumentException
      }
    }
    class ScalarAddsToArray(i: Int) {
      def +(a: Array[Int]) = a.map(_ + i)
    }
    implicit def array2addable(a: Array[Int]) = new ArraysAdd(a)
    implicit def scalar2arrayaddable(i: Int) = new ScalarAddsToArray(i)
    

    scala> Array(1,2,3) + 5
    res2: Array[Int] = Array(6, 7, 8)
    
    scala> Array(1,7) + Array(3,2)
    res3: Array[Int] = Array(4, 9)
    
    scala> 4 + Array(-2,-3,-1)
    res4: Array[Int] = Array(2, 1, 3)
    

    如果您想覆盖所有的数据类型,它就变得更加复杂了(您至少需要使用泛型和数字——或者编写一个代码生成器来覆盖您需要的情况),为了提高效率,您可能需要创建一个定制的“matrix”类,而不是继续使用原始数组,而这些数组需要额外的功能来包装。

    这包括基本操作。对于数学函数,如 math.sqrt ,如果你不介意的话 a map sqrt sqrt(a) 那你什么都不用做。否则,您可以自己重载它们;很乏味,但这样就可以透明地使用它们。

    或者你可以使用一个已经为你做了很多的图书馆。(Scalala是我所知道的矩阵的最佳候选者。)

        2
  •  5
  •   Dave Griffith    14 年前

    没有任何真正的方法来自动提升Scala操作,因为您需要支持APL和J等数组编程语言。Scala中最接近数组自动提升的是隐式转换,这是不太正确的。Scala隐式转换走相反的路,转换操作的目标,而不是操作本身。即使这样,Scala隐式转换也不会连锁,因此即使可以将标量操作提升到向量(不能提升),也不会自动将其提升到二维或更高的数组。

        3
  •  5
  •   Steve Lianoglou    14 年前

    scalala 你在找什么?