2016-04-26 137 views
-1

我寫過這個函數,它應該返回表示算術表達式的字符串。將表達式轉換爲字符串

 import scala.util.parsing.combinator._ 

object ArithEval extends ArithEvalLike { 


def eval (e:Expr):Double = e match { 
    case Num(a) => a 
    case Exponent(a,b) => Math.pow(eval(a),eval(b)) 
    case Add(a,b) =>eval(a) + eval(b) 
    case Sub(a,b) =>eval(a) - eval(b) 
    case Mul(a,b) =>eval(a) * eval(b) 
    case Div(a,b) =>eval(a)/eval(b) 
    } 
} 


object ArithPrinter extends ArithPrinterLike { 
def print (e: Expr): String = e match { 
    case Num(a) => "a" 
    case Exponent(a,b) =>print(a).toString + "^" + print(b).toString 
    case Add(a,b) => print(a).toString + "+" + print(b).toString 
    case Sub(a,b) => print(a).toString + "-" + print(b).toString 
    case Mul(a,b) =>print(a).toString + "*" + print(b).toString 
    case Div(a,b) =>print(a).toString + "/" + print(b).toString 
    } 
} 

這似乎不正確,因爲我的一些測試失敗。

下面是我跑的測試:

階> ArithPrinter.print(Mul的(民(2.0),穆爾(添加(民(3.0),序號(5.0)),NUM(-10.0))) )

它說,它無法找到「民」

我不知道這是否是我的測試是錯誤的或者功能本身。

我在正確的軌道上嗎?

+2

什麼是失敗的測試?你可以發佈整個代碼嗎? –

+0

發佈失敗的測試代碼。 – marcospereira

+0

我們不能說沒有'Num','Add'等的定義。如果我說「找不到Num」,可能沒有定義Num''或者它是錯誤的類型 –

回答

0
case Num(a) => "a" 

這看起來不對。你只是在打印字符串「a」。你可能想要a.toString

+0

我改變了但同樣的錯誤發生 – rocketman

+0

你的Num的構造函數是什麼?你可能創建了一個需要一個Int但是傳遞一個float的case類? – Ren