表达式求值

表达式求值

表达式

表达式 = 值 | 表达式 + 表达式

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

posted @ 2025-05-21 22:09  (.)$(.)  阅读(7)  评论(0)    收藏  举报