В другом вопросе Боб представил следующее 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)
. Каким образом реализация интерпретатора по имени может отличаться от представленного выше?
Плоткин изучил call-by-name and call-by-value strategies для оценки исчисления лямбда в 1970-х годах.
Это похоже на звонок от меня, так как Haskell - это вызов по необходимости (modulo pedantry) – luqui
'f $! интерпретировать env e2' заставит вас позвонить по значению. – luqui
@loqui Это определенно не по запросу, а по вызову. Обычный комбинированный Y-комбинатор по имени вызывает [бесконечный цикл] (http: // stackoverflow.com/a/6715144/414413), предполагая, что это на самом деле позывной и требует вызова по значению [компилятор с фиксированной запятой] (http://en.wikipedia.org/wiki/Fixed-point_combinator). – Cirdec