键入在REPL中工作但不在scala类/对象中的别名

时间:2015-01-09 22:11:44

标签: scala types

我有一个测试程序,我们在内存中有静态数组。我使用类型别名是为了简洁。

以下适用于REPL

type >[T] = Array[T]
val dat = >(>(1,2,3),>(2,3,4))

dat: Array[Array[Int]] = Array(Array(1, 2, 3), Array(2, 3, 4))

然而,将标识符更改为" A"来自">" 工作:创建了类型,但创建上面使用的数组的语法相同失败:

scala> type A[T] = Array[T]
defined type alias A

scala> val dat = A(A(1,2,3),A(2,3,4))
<console>:7: error: not found: value A
       val dat = A(A(1,2,3),A(2,3,4))

此外,上述两个内容中的任何一个都在Scala计划AFAICT中工作:

  test("VectorProjection") {
    type  A[T] = Array[T]
    // Next line shows RED for all the A's and also has compiler error: "not found: value A"
    val dat  = A(A(1., 2., 3.), A(1.5,2.,2.5), A(2.,3.8,5.6), A(2.5,3.0,3.5), A(3.1,3.7,4.3) )
    val firsteigen =  subtractProject(dat(0), dat(4))
  }

寻找:

  • 1)对于REPL:解释为什么符号&#34;&gt;&#34;有效,但没有 标识符会有所帮助。
  • 2)对于真正的scala程序/类: 解释是否可以使用任何类似的语法 以上

更新根据James Iry的建议,以下方法确实有效:

    def A[T : ClassTag](ts: T*) = Array(ts:_*)

这是在行动:

  test("VectorProjection") {
    def A[T : ClassTag](ts: T*) = Array(ts:_*)
    val dat  = A(
      A(1., 2., 3.),
      A(1.5,2.,2.5),
      A(3.,6.,9.)  )
    val firstEigen =  subtractProject(dat(0), dat(5))
    println(s"firstEigen: ${firstEigen.mkString(",")}")
  }

另一个更新另一个答案更接近这个OP:

同时使用type和val:

    type A = Array[Double]
    val A = Array

这是在行动:

  test("VectorProjection") {
    type A = Array[Double]
    val A = Array
    val dat  = A(
      A(1., 2., 3.),
      A(1.5,2.,2.5),
      A(3.,6.,9.)  )
    val firstEigen =  subtractProject(dat(0), dat(5))
    println(s"firstEigen: ${firstEigen.mkString(",")}")
  }

3 个答案:

答案 0 :(得分:3)

我无法使用'&gt;'

复制您的成功
scala> type >[T]=Array[T]
defined type alias $greater

scala> >(1,2,3)
<console>:8: error: not found: value >
              >(1,2,3)
              ^

至少,直到我定义它

scala> import scala.reflect._
import scala.reflect._

scala> def >[T : ClassTag](ts: T*) = Array(ts:_*)
$greater: [T](ts: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]

scala> >(1,2,3)
res1: Array[Int] = Array(1, 2, 3)

同样适用于A

scala> type A[T]=Array[T]
defined type alias A

scala> A(1,2,3)
<console>:11: error: not found: value A
              A(1,2,3)
              ^

scala> def A[T : ClassTag](ts: T*) = Array(ts:_*)
A: [T](ts: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]

scala> A(1,2,3)
res2: Array[Int] = Array(1, 2, 3)

有关解释:类型X = Y只是为类型X创建一个同义词。它不会为可能与类型相关联的所有其他内容(如伴随对象,构造函数方法等)引入同义词。

答案 1 :(得分:2)

如果您创建了一个值别名,它将起作用:

type A[T] = Array[T]
val A = Array
val dat = A(A(1,2,3),A(2,3,4)) //dat: Array[Array[Int]] = Array(Array(1, 2, 3), Array(2, 3, 4))

第2行创建了一个值别名,因此您可以使用A类型别名创建值。它将反过来能够调用A.apply(1,2,3)。

答案 2 :(得分:1)

使用它来显示repl知道的内容:

scala> $intp.definedTerms
res0: List[$intp.global.TermName] = List($intp)

scala> $intp.definedTypes
res1: List[$intp.global.TypeName] = List($greater)

例如,你可能有:

scala> object X
defined object X

scala> trait X
defined trait X
warning: previously defined object X is not a companion to trait X.
Companions must be defined together; you may wish to use :paste mode for this.

scala> type X = String
defined type alias X

但它没有警告别名。