4

以下のクラスExprを実行したい。このコードはhttp://andymaleh.blogspot.ie/2008/04/scalas-pattern-matching-visitor-pattern.htmlから取得しました

ここに私がしようとしているものがあります:

import Expr.Sum

object Main {

    def main(args:Array[String]) {

      var expr1 = new Sum(new Num(1), new Prod(new Num(2), new Num(3)))
      print(expr1)
  }

}

abstract class Expr {

  case class Num(n: Int) extends Expr
  case class Sum(l: Expr , r: Expr) extends Expr
  case class Prod(l: Expr, r: Expr) extends Expr

  def evalExpr(e: Expr): Int = e match {
    case Num(n) => n
    case Sum(l, r) => evalExpr(l) + evalExpr(r)
    case Prod(l, r) => evalExpr(l) * evalExpr(r)
  }

  def printExpr(e: Expr) : Unit = e match {
    case Num(n) => print(" " + n + " ")
    case Sum(l, r) => printExpr(l); print("+"); printExpr(r)
    case Prod(l, r) => printExpr(l); print("x"); printExpr(r)
  }

}

しかしライン

import Expr.Sum

コンパイル時エラーが発生しています: 'not found: object Expr' . クラス Expr をインポートするにはどうすればよいですか?

4

2 に答える 2

11

インスタンスのメンバーのみをインポートできます。したがって、コードは次のようになります。

object Main {
    def main(args:Array[String]) {
      val expr = new Expr {} // now we have a instance.

      import expr._
      var expr1 = new Sum(new Num(1), new Prod(new Num(2), new Num(3)))
      print(expr1)
  }
}

インスタンス以外のメンバーをインポートできない理由を簡単な例で説明します。

class A(val x:Int) {
  object Print { def print = println(x) }
}

できるとしたらimport A.Print、どの値にバインドされxますか? では、次のようにします。

val a = new A(5); // we have a value bound to x.
import a._
Print.print

これが一つの理由です。もう 1 つの理由はnew A(5).Print != new A(5).Print、等式だけでなく type:val (a1, a2) = (new A(5), new A(5)); implicitly[a1.Print <:< a2.Print]がコンパイルされないことです。これは、Scala がパス依存型と呼ぶものです。

于 2012-11-10T04:02:36.517 に答える
1

ケースクラスを抽象クラスから移動すると、コンパイルされます。この場合、それらは同じスコープにもあるため、インポートするものはありません。

また、 とは同じパッケージで定義されているため、importここではエラーは適用されないことに注意してください。つまり、デフォルトのパッケージです。MainExpr

object Main {    
    def main(args:Array[String]) {

      var expr1 = new Sum(new Num(1), new Prod(new Num(2), new Num(3)))
      print(expr1)
  }
}

abstract class Expr {
}

case class Num(n: Int) extends Expr
case class Sum(l: Expr , r: Expr) extends Expr
case class Prod(l: Expr, r: Expr) extends Expr

def evalExpr(e: Expr): Int = e match {
  case Num(n) => n
  case Sum(l, r) => evalExpr(l) + evalExpr(r)
  case Prod(l, r) => evalExpr(l) * evalExpr(r)
}

def printExpr(e: Expr) : Unit = e match {
  case Num(n) => print(" " + n + " ")
  case Sum(l, r) => printExpr(l); print("+"); printExpr(r)
  case Prod(l, r) => printExpr(l); print("x"); printExpr(r)
}

これを実行すると、次のようになります。

scala>Main.main(Array[String]())
Sum(Num(1),Prod(Num(2),Num(3))) 
于 2012-11-10T01:51:55.763 に答える