2014-02-23 48 views
0

我是新来的斯卡拉,我正在按照本教程http://docs.scala-lang.org/tutorials/scala-for-java-programmers.html其中有一个案例类的用法的例子。斯卡拉执行抽象类与案例

我试图执行下面的例子:

package classes 

abstract class Tree 
case class Sum(l: Tree, r: Tree) extends Tree 
case class Var(n: String) extends Tree 
case class Const(v: Int) extends Tree { 

    type Environment = String => Int 

    def eval(t: Tree, env: Environment): Int = t match { 
     case Sum(l, r) => eval(l, env) + eval(r, env) 
     case Var(n) => env(n) 
     case Const(v) => v 
    } 
} 

但问题是,我无法执行它,我怀疑的原因是,我不能添加一个主要方法有,因为它是一个类而不是对象。所以,我创建了一个对象与主要方法有:

package classes 

object TreeOperations { 
    type Environment = String => Int //XXX: cannot I import it somehow? 

    def main(args: Array[String]) {  
     // evaluating (x+x)+(7+y) expression 
     val exp: Tree = Sum(Sum(Var("x"), Var("x")),Sum(Const(7), Var("y"))) 
     val env: Environment = { case "x" => 5 case "y" => 7} // x := 5, y := 7 
     println("Expression: " + exp) 
     println("Evaluation with x=5, y=7: " + eval(exp, env)) //XXX no eval here 
    } 
} 

但后来我注意到两两件事:

  1. 我无法访问类型的环境,因为它是一个可依使用类(我试过树。环境,但它没有工作)。

  2. 我无法访问eval(...)(以及我试过的)。

所以我想知道什么是解决这些困难的最好方法。

在此先感谢!

回答

2

在本教程中,我看不到他们在说他们在说什么类型声明和eval方法应该在Const案例类中定义。我会把这些放在案例类之外,但在同一对象或导入的对象中,例如:

将所有定义放入一个或多个文件中(在这种情况下,只要确保在需要时导入声明):

package classes 

abstract class Tree 
case class Sum(l: Tree, r: Tree) extends Tree 
case class Var(n: String) extends Tree 
case class Const(v: Int) extends Tree 

在TreeOperations文件,你将有以下:

package classes 

import Tree._ 

object TreeOperations { 
    type Environment = String => Int //XXX: cannot I import it somehow? 

    def eval(t: Tree, env: Environment): Int = t match { 
    case Sum(l, r) => eval(l, env) + eval(r, env) 
    case Var(n) => env(n) 
    case Const(v) => v 
    } 

    def main(args: Array[String]) {  
    // evaluating (x+x)+(7+y) expression 
    val exp: Tree = Sum(Sum(Var("x"), Var("x")),Sum(Const(7), Var("y"))) 
    val env: Environment = { case "x" => 5 case "y" => 7} // x := 5, y := 7 
    println("Expression: " + exp) 
    println("Evaluation with x=5, y=7: " + eval(exp, env)) //XXX no eval here 
    } 
} 
+0

我想有一个类/每个文件的对象,即一个Tree.scala,另一个TreeOperations.scala与主要方法,这可能吗? –

+0

是的你可以,只要确保导入相关的类型,即Tree,Sum,...然后'TreeOperations'对象应该包含操作'eval'和类型Environment的定义。我正在更新我的答案。 – Peter

+0

太棒了,谢谢!我不知道我必须导入其他类才能在对象内部访问它。通过这种方式,我可以在我的Tree类中定义所有内容,然后仅将该对象用于主方法,这正是我想要的。非常感谢您的帮助。 –

-1

我会写这样的:

package classes 

abstract class Tree 

case class Sum(l: Tree, r: Tree) extends Tree 

case class Var(n: String) extends Tree 

case class Const(v: Int) extends Tree { 

    type Environment = String => Int 

    def eval(t: Tree, env: Environment): Int = t match { 
     case Sum(l, r) => eval(l, env) + eval(r, env) 
     case Var(n) => env(n) 
     case Const(v) => v 
    } 
} 

object AppMain extends App { 
    // evaluating (x+x)+(7+y) expression 
    val exp: Tree = Sum(Sum(Var("x"), Var("x")),Sum(Const(7), Var("y"))) 
    val env: Environment = { case "x" => 5 case "y" => 7} // x := 5, y := 7 
    println("Expression: " + exp) 
    println("Evaluation with x=5, y=7: " + eval(exp, env)) //XXX no eval here 
} 

scala-api docs for App

+0

我想要的是每个文件一个类/对象,即一个Tree.scala和另一个TreeOperations.scala与主方法,这可能吗? –

+0

还有一件事:如果我这样做,我已经检查过无法访问AppMain对象中的Environment类型。我试图从类中声明Environment类型,但它不起作用。 –