【发布时间】:2015-05-01 15:31:25
【问题描述】:
在另一个问题中,Bob 提出了以下interpreter for the untyped lambda calculus。
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 remarked 由于F f -> f (interpret env e2),此解释器是按值调用的。 名称调用解释器的实现与上面介绍的解释器有何不同?
Plotkin 在 1970 年代研究了 call-by-name and call-by-value strategies 以评估 lambda 演算。
【问题讨论】:
-
这对我来说看起来像是按需调用,因为 Haskell 是按需调用(模pedantry)
-
f $! interpret env e2会让您按价值致电。 -
@loqui 这绝对不是按需调用或按名称调用。正常的按名称调用 Y 组合器会导致 infinite loop,这表明这实际上是按值调用并且需要按值调用 fixed-point combinator。
标签: haskell lambda-calculus callbyname call-by-value