Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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
Scala奇怪的代码无法理解这一点:Visitor[String]⇒;_Scala - Fatal编程技术网

Scala奇怪的代码无法理解这一点:Visitor[String]⇒;

Scala奇怪的代码无法理解这一点:Visitor[String]⇒;,scala,Scala,我是Scala的新手,所以请不要投票给我。表达式这个是什么:访问者[双重]⇒意味着什么?对我来说,它看起来像是不完整的代码。我试图在谷歌上找到这个概念,但由于我不知道这个概念的名字,我无法找到它 import scala.language.higherKinds trait Expressions { trait TVisitor[T] { def visitConstant(v: Double): T } type Visitor[T] <: TVisitor[T

我是Scala的新手,所以请不要投票给我。表达式
这个是什么:访问者[双重]⇒意味着什么?对我来说,它看起来像是不完整的代码。我试图在谷歌上找到这个概念,但由于我不知道这个概念的名字,我无法找到它

import scala.language.higherKinds

trait Expressions {

  trait TVisitor[T] {
    def visitConstant(v: Double): T
  }
  type Visitor[T] <: TVisitor[T]

  trait Expression {
    def accept[T](visitor: Visitor[T]): T
  }

  class Constant(val v: Double) extends Expression {
    def accept[T](visitor: Visitor[T]): T = visitor.visitConstant(v)
  }

  trait EvalVisitor extends TVisitor[Double] {
    def visitConstant(v: Double): Double = v
  }
}

trait AddExpressions extends Expressions {
  class Add(val l: Expression, val r: Expression) extends Expression {
    def accept[T](visitor: Visitor[T]): T = visitor.visitAdd(l, r)
  }

  trait TVisitor[T] extends super.TVisitor[T] {
    def visitAdd(l: Expression, r: Expression): T
  }
  type Visitor[T] <: TVisitor[T]

  trait EvalVisitor extends super.EvalVisitor with TVisitor[Double] {
    this: Visitor[Double] ⇒
    def visitAdd(l: Expression, r: Expression): Double =
      l.accept(this) + r.accept(this)
  }
}

trait ExtendedExpressions extends AddExpressions with MultExpressions {
  type Visitor[T] = TVisitor[T]
  trait TVisitor[T]
      extends super[AddExpressions].TVisitor[T]
      with super[MultExpressions].TVisitor[T]
  object EvalVisitor
      extends super[AddExpressions].EvalVisitor
      with super[MultExpressions].EvalVisitor
      with TVisitor[Double] {
    this: Visitor[Double] ⇒
  }
}

trait PrefixNotationForExpressions extends ExtendedExpressions {
  object PrefixNotationVisitor extends super.TVisitor[String] {
    this: Visitor[String] ⇒
    def visitConstant(v: Double): String = v.toString + " "
    def visitAdd(l: Expression, r: Expression): String =
      "+ " + l.accept(this) + r.accept(this)
    def visitMult(l: Expression, r: Expression): String =
      "* " + l.accept(this) + r.accept(this)
  }
}
导入scala.language.higherKinds
特征表达{
特征TVisitor[T]{
def visitConstant(v:Double):T
}

输入Visitor[T]
this:Visitor[Double]⇒
在Scala中称为
自类型
。其文档可以阅读

在本例中,这意味着实现
PrefixNotiationForExpressions
的任何类也必须实现
Visitor[String]


Java中没有与Self类型等价的类型。关于Self类型,最常见的问题是为什么不在trait的extends子句中声明该类型。下面的StackOverflow引用很好地解释了这一点:。核心区别归结为我们是表示“is a”关系还是表示“requires”关系p、

这:访客[双倍]⇒
在Scala中称为
自类型
。其文档可以阅读

在本例中,这意味着实现
PrefixNotiationForExpressions
的任何类也必须实现
Visitor[String]

Java中没有与Self类型等价的类型。关于Self类型,最常见的问题是为什么不在trait的extends子句中声明该类型。下面的StackOverflow引用很好地解释了这一点:。核心区别归结为我们是表示“is a”关系还是表示“requires”关系p