Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
键入在REPL中工作但不在scala类/对象中工作的别名_Scala_Types - Fatal编程技术网

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

键入在REPL中工作但不在scala类/对象中工作的别名,scala,types,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] = Arra

我有一个测试程序,里面有内存中的静态数组。为了简洁起见,我使用了类型别名

以下内容适用于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))
寻找:

  • 1) 对于REPL:解释为什么符号“>”起作用但不起作用 标识符会很有帮助
  • 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(",")}")
  }
  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(",")}")
  }
另一个更新另一个答案更接近此操作:

同时使用type和val:

    type A = Array[Double]
    val A = Array
这就是它的作用:

  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(",")}")
  }
  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(",")}")
  }

我无法用“>”复制您的成功

scala> type >[T]=Array[T]
defined type alias $greater

scala> >(1,2,3)
<console>:8: error: not found: value >
              >(1,2,3)
              ^
同样的事情也适用于家庭

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)
scala>类型A[T]=数组[T]
定义的类型别名A
scala>A(1,2,3)
:11:错误:未找到:值A
A(1,2,3)
^
scala>defa[T:ClassTag](ts:T*)=Array(ts:*)
A:[T](ts:T*)(隐式证据$1:scala.reflect.ClassTag[T])数组[T]
scala>A(1,2,3)
res2:Array[Int]=数组(1,2,3)

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

我无法用'>'复制您的成功

scala> type >[T]=Array[T]
defined type alias $greater

scala> >(1,2,3)
<console>:8: error: not found: value >
              >(1,2,3)
              ^
同样的事情也适用于家庭

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)
scala>类型A[T]=数组[T]
定义的类型别名A
scala>A(1,2,3)
:11:错误:未找到:值A
A(1,2,3)
^
scala>defa[T:ClassTag](ts:T*)=Array(ts:*)
A:[T](ts:T*)(隐式证据$1:scala.reflect.ClassTag[T])数组[T]
scala>A(1,2,3)
res2:Array[Int]=数组(1,2,3)

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

如果创建值别名,它将起作用:

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.apply(1,2,3)。

如果您创建一个值别名,它将工作:

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.apply(1,2,3)。

使用它来显示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

但它不会对别名发出警告。

使用此选项显示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

但它不会对别名发出警告。

您使用的是什么版本的scala?您的第一个示例不适用于我(scala 2.11.2)(而afaik不/不应该适用于任何版本)。至于原因,请参见。@Marth scala 2.10.4每个人都想知道您是如何中断repl会话的。我所说的中断是指,您的repl处于无法复制的状态。如果能诊断出来就好了。REPL历史是一个很大的状态,它可以产生欺骗性的结果;注释代码
//show
以显示代码编译的目的,包括从历史记录中导入的内容。顺便说一句,艾瑞的答案是正确的;你并不是说你的第一个例子有效,对吧?你使用的是什么版本的scala?您的第一个示例不适用于我(scala 2.11.2)(而afaik不/不应该适用于任何版本)。至于原因,请参见。@Marth scala 2.10.4每个人都想知道您是如何中断repl会话的。我所说的中断是指,您的repl处于无法复制的状态。如果能诊断出来就好了。REPL历史是一个很大的状态,它可以产生欺骗性的结果;注释代码
//show
以显示代码编译的目的,包括从历史记录中导入的内容。顺便说一句,艾瑞的答案是正确的;您并不是说您的第一个示例有效,对吧?有趣的是,您无法复制REPL成功。我接受了您的代码(没有明确地分配给变量),它也起了作用。但对于这里的主要事件:我喜欢你的def,并将在一个真正的程序中尝试它。我最初给出了这个答案,但不久后又给出了另一个答案,这是对OP的更精确的答案。这个问题在任何情况下都是有帮助的,我相应地提高了投票率。有趣的是,你无法重现REPL的成功。我接受了您的代码(没有明确地分配给变量),它也起了作用。但对于这里的主要事件:我喜欢你的def,并将在一个真正的程序中尝试它。我最初给出了这个答案,但不久后又给出了另一个答案,这是对OP的更精确的答案。这个问题在任何情况下都是有帮助的,我相应地提高了投票率。我选择这个答案是正确的,因为它最直接地响应OP。我选择了这个答案是正确的,因为它是对OP最直接的回应。谢谢这是有用的信息。谢谢这是有用的信息。