表达式求值
表达式求值
表达式
表达式 = 值 | 表达式 + 表达式
data Expr = Val Int | Add Expr Expr | Mul Expr Expr
操作
操作 = 求值表达式 | + n
上下文: 表达式对应的操作序列
data Op = LeftAdd Expr | RightAdd Int | LeftMul Expr | RightMul Int
eval
表达式求值
最外层表达式为:
- Val n: 值 n
- Add x y: 表达式 x 求值, EVALA y 加入操作栈顶
- Mul x y: 表达式 x 求值, EVALM y 加入操作栈顶
exec
操作求值
栈顶操作为:
- []: n
- EVALA y: 表达式 y 求值, ADD n 加入操作栈顶
- ADD m: 操作 (n+m)
- EVALM y: 表达式 y 求值, MUL n 加入操作栈顶
- MUL m: 操作 (n*m)
代码
data Expr = Val Int | Add Expr Expr | Mul Expr Expr
type Cont = [Op]
data Op = LeftAdd Expr | RightAdd Int | LeftMul Expr | RightMul Int
-- 表达式 context 求值
eval :: Expr -> Cont -> Int
eval (Val n) c = exec c n
eval (Add x y) c = eval x (LeftAdd y : c)
eval (Mul x y) c = eval x (LeftMul y : c)
-- 单次操作
exec :: Cont -> Int -> Int
exec [] n = n
exec (LeftAdd y:c) n = eval y (RightAdd n : c)
exec (RightAdd m:c) n = exec c (n+m)
exec (LeftMul y:c) n = eval y (RightMul n : c)
exec (RightMul m:c) n = exec c (n*m)
-- 表达式求值
value :: Expr -> Int
value e = eval e []
-- 测试
-- 60
expr = Mul (Add (Mul (Add (Add (Val 2) (Val 3)) (Val 4)) (Val 2)) (Val 2)) (Add (Val 2) (Val 1))
res = value expr
参考: Programming in Haskell ch8.7