对不起,这太长了,但是...
恐怕答案在很大程度上取决于单词的含义......
首先,这是 Haskell 中的代码(使用静态绑定和惰性求值):
readInt :: String -> Int
readInt = read
main = do
x <- fmap readInt getLine
let y = x + 3
print y
x <- fmap readInt getLine
print y
它打印8 和8。
下面是 R 中使用惰性求值的代码,有些人称之为
动态绑定:
delayedAssign('x', as.numeric(readLines(n=1)))
delayedAssign('y', x + 3)
print(y)
delayedAssign('x', as.numeric(readLines(n=1)))
print(y)
它打印8 和8。没什么不同!
现在在 C++ 中,它使用严格的评估和静态绑定:
#include <iostream>
int main() {
int x;
std::cin >> x;
int y = x + 3;
std::cout << y << "\n";
std::cin >> x;
std::cout << y << "\n";
}
它打印8 和8。
现在让我告诉你我认为问题的重点是什么;)
“懒惰的评估”可能意味着许多不同的事情。在 Haskell 中,它有一个非常
特殊含义,即嵌套表达式中的含义:
f (g (h x))
评估就像f 被评估之前 g (h x),即评估
去“外面->里面”。实际上这意味着如果f 看起来像
f x = 2
ie 只是扔掉它的论点,g (h x) 永远不会被评估。
但我认为这 不是 问题与“懒惰”有关
评价”。我认为这是因为:
Haskell 人通常不会称其为“惰性评估”——他们会称其为
它懒惰(或延迟)执行。
那么延迟执行对您的问题意味着什么?这将意味着
action keyboard input 被延迟...直到值 x 真的是
需要。在我看来,这种情况发生在这里:
echo y
因为此时您必须向用户显示一个值,因此您必须知道什么
x是!那么惰性执行和静态绑定会发生什么?
x = keyboard input # nothing happens
y = x + 3 # still nothing happens!
echo y (8) # y becomes 8. 8 gets printed.
x = keyboard input (2) # nothing happens
echo y # y is still 8. 8 gets printed.
现在关于“动态绑定”这个词。它可能意味着不同的东西:
变量范围和生命周期在运行时决定。这是什么语言
像 R 那样不声明变量。
计算公式(如 y 的公式是 x + 3)不是
检查直到变量被评估。
我的猜测是,这就是您的问题中“动态绑定”的含义。去
再次使用 dynamic 绑定(意义 2)和 延迟执行:
x = keyboard input # nothing happens
y = x + 3 # still nothing happens!
echo y (8) # y becomes 8. 8 gets printed.
x = keyboard input (2) # nothing happens
echo y # y is already evaluated,
# so it uses the stored value and prints 8
我知道没有一种语言会在最后一行实际打印7...但我
真的认为这就是问题所希望发生的事情!