2017-10-05 30 views
0

嗨我需要计算类型的帮助。整个程序假设要一个字符串,解析它,最后计算一个值。我开始的字符串可以是这样的:“let X = + 1 2 in * X 2 - X”。当我解析它时,我会得到这个:“Let (Vari X) (Sum (Lit 1) (Lit 2)) (Mul (Vari X) (Lit 2)))”。此时,我可以解析像这样的“* + 2 3 * 2 + 6 - 2”和之前的表达式。但我无法计算出前面的表达式,“let X = + 1 2 in * X 2 - X”。如果有人能指引我朝着正确的方向发展,我会很高兴,因为现在,我真的不知道我会如何做这项工作。由于Haskell - 计算字符串“让X = 3 in + X X”

代码:

data Chara = A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z deriving (Eq, Show) 

data Number = Single Int | Many Int Number deriving (Eq, Show) 

data Expr = Lit Int | Sub Expr | Sum Expr Expr | Mul Expr Expr | Vari Chara | Let Expr Expr Expr 
    deriving Show 


--Want to calculate this 
--Let (Vari X) (Sum (Lit 1) (Lit 2)) (Mul (Vari X) (Lit 2))) 


calculate :: Expr -> Int 
calculate (Sub a) = let e = calculate a in (-e) 
calculate (Sum a b) = let e = calculate a 
          r = calculate b 
         in (e+r)   
calculate (Mul a b) = let e = calculate a 
          r = calculate b 
         in (e*r) 
calculate (Lit a) = a  
+0

你肯定应该'让Expr的Expr的Expr'而不是'让甜心Expr的Expr'? (并不是说这是完全不合理的,但它有点棘手,可能不值得在教育方面)。 – leftaroundabout

+0

是否[你们](https://stackoverflow.com/questions/46584907/haskell-parsing-input-functions)获得同一班级的作业? –

+0

我正在做一项任务。不知道其他人。 – iIllumination

回答

1

您需要在您的AST执行变量替换。即您需要一个函数

substitute :: (Chara, Expr) -> Expr -> Expr 

其中,给定的一对变量的替代表达来代替它会遍历树,并执行替换。这基本上意味着:如果您发现一个Vari,只需用替换替换它。如果您发现像Sum a b子表达式什么,递归下降到这些子表达式,然后重建操作的结果,即

 Sum (substitute s a) (substitute s b) 

然后calculate (Let var subst expr) = ...substitute功能的一个非常简单的调用。

+0

谢谢!我想我得到了一些开始工作的东西! :d – iIllumination

1

就像一个魅力

calculate :: Expr -> Int 
calculate (Sub a) = let e = calculate a in (-e) 
calculate (Sum a b) = let e = calculate a 
          r = calculate b 
         in (e+r)   
calculate (Mul a b) = let e = calculate a 
          r = calculate b 
         in (e*r) 
calculate (Let a b c) = calculate (substitute (getCharaFromExpr a) b c) 
calculate (Lit a) = a  


substitute :: Chara -> Expr -> Expr -> Expr 
substitute x y (Lit a) = Lit a 
substitute x y (Vari a) | x == a = y 
         | otherwise = Vari a 
substitute x y (Sum a b) = Sum (substitute x y a) (substitute x y b) 
substitute x y (Mul a b) = Mul (substitute x y a) (substitute x y b) 
substitute x y (Sub a) = Sub (substitute x y a) 
substitute x y (Let a b c) = Let (substitute x y a) (substitute x y b) (substitute x y c)