在另一个问题中,Bob为无类型 lambda 演算提供了以下解释器。
data Expr = Var String | Lam String Expr | App Expr Expr
data Value a = V a | F (Value a -> Value a)
interpret :: [(String, Value a)] -> Expr -> Value a
interpret env (Var x) = case lookup x env of
Nothing -> error "undefined variable"
Just v -> v
interpret env (Lam x e) = F (\v -> interpret ((x, v):env) e)
interpret env (App e1 e2) = case interpret env e1 of
V _ -> error "not a function"
F f -> f (interpret env e2)
Ivan Zakharyaschev 说这个解释器是按值调用的,因为F f -> f (interpret env e2)
. 名称调用解释器的实现与上面介绍的解释器有何不同?
Plotkin在 1970 年代研究了用于评估 lambda 演算的名称调用和值调用策略。