Haskell-计算字符串“;设X=3in+;";

Haskell-计算字符串“;设X=3in+;";,haskell,recursion,Haskell,Recursion,嗨,我需要帮助计算一个类型。假设整个程序取一个字符串,解析它,最后计算一个值。我以以下字符串开头:“让X=+12 in*x2-X”。当我解析它时,我会得到这样的结果:“Let(varix)(Sum(lit1)(lit2))(Mul(varix)(lit2))”。现在,我可以解析这样的表达式“*+23*2+6-2”和前面的表达式。但是我不能计算前面的表达式,“让X=+12 in*x2-X”。如果有人能给我指出正确的方向,我会很高兴的,因为现在,我真的不知道我该怎么做。谢谢 代码: data Cha

嗨,我需要帮助计算一个类型。假设整个程序取一个字符串,解析它,最后计算一个值。我以以下字符串开头:“
让X=+12 in*x2-X
”。当我解析它时,我会得到这样的结果:“
Let(varix)(Sum(lit1)(lit2))(Mul(varix)(lit2))
”。现在,我可以解析这样的表达式“*+23*2+6-2”和前面的表达式。但是我不能计算前面的表达式,“
让X=+12 in*x2-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       
您需要在AST中执行变量替换。也就是说,你需要一个函数

substitute :: (Chara, Expr) -> Expr -> Expr
给定一对要替换的变量和表达式,将遍历树并执行该替换。这基本上意味着:如果您找到一个
Vari
,只需用替换替换它即可。如果您发现任何具有子表达式(如
Sum a b
)的内容,请向下递归到这些子表达式中,然后使用结果重新生成运算符,即

        Sum (substitute s a) (substitute s b)
然后,
calculate(Let var subst expr)=……
是对
substitute
函数的一个非常简单的调用。

您需要在AST中执行变量替换。也就是说,你需要一个函数

substitute :: (Chara, Expr) -> Expr -> Expr
给定一对要替换的变量和表达式,将遍历树并执行该替换。这基本上意味着:如果您找到一个
Vari
,只需用替换替换它即可。如果您发现任何具有子表达式(如
Sum a b
)的内容,请向下递归到这些子表达式中,然后使用结果重新生成运算符,即

        Sum (substitute s a) (substitute s b)
然后,
calculate(让var subst expr)=……
是对
substitute
函数的一个非常简单的调用。

工作起来很有魅力

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) 
很有魅力

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) 

您确定它应该是
Let Expr Expr Expr
而不是
Let Chara Expr Expr
?(并不是说这完全不合理,但这有点棘手,可能不值得教育)。你是在为同一个班级做作业吗?我正在做作业。不知道另一个人。@LeftArounda关于不,实际上是Expr,因为Expr可能是变量,这是一个字符你确定它应该是
让Expr Expr Expr
而不是
让Chara Expr Expr
?(并不是说这完全不合理,但这有点棘手,可能不值得教育)。你是在为同一个班级做作业吗?我正在做作业。不知道另一个人。@LeftArounda关于不,这实际上是Expr,因为Expr可能是Vari,这是一个字符谢谢!我想我有办法开始工作了!:汉克斯!我想我有办法开始工作了!:D