背景
我正在根据在线课程学习 sicp,并对其讲义感到困惑。在讲义中,应用顺序似乎等于 cbv,正常顺序等于 cbn。
困惑
But the wiki http://en.wikipedia.org/wiki/Evaluation_strategy#Applicative_order指出,除了评估顺序(从左到右、从右到左或同时)之外,应用顺序和 CBV 之间也存在差异:
与按值调用不同,应用顺序求值在应用函数之前尽可能地减少函数体内的项。
我不明白减少是什么意思。在进入函数求值之前,applicative order 和 cbv 不是都会获取变量的准确值吗?
对于正常的订单和cbv,根据wiki http://en.wikipedia.org/wiki/Evaluation_strategy#Normal_order.
相反,按名称调用策略不会在未应用的函数体内进行计算。
我想这是否意味着正常顺序将在未应用的函数体内进行评估。怎么会这样?
Question
- 有人可以给我这四种策略的一些更具体的定义吗?
- 有人可以使用任何编程语言展示每种策略的示例吗?
多谢?
适用顺序(不考虑
评估顺序(在方案中未定义)将等同于 CBV。函数调用的所有参数在进入函数体之前都会被完全评估。这是给出的例子
SICP
(define (try a b)
(if (= a 0) 1 b))
如果您定义该函数,并使用这些参数调用它:
(try 0 (/ 1 0))
当使用应用顺序评估(方案中的默认值)时,这将产生错误。它将评估(/ 1 0)
在进入身体之前。当使用正常顺序评估时,这将返回 1。参数
将在不评估的情况下传递给函数体并且(/ 1 0)
永远不会被评估,因为(= a 1)
为真,避免了错误。
在您链接到的文章中,当他们提到应用和正常顺序评估时,他们正在谈论 Lambda 演算。在本文中wiki https://en.wikipedia.org/wiki/Lambda_calculus#Lambda_calculus_and_programming_languages我认为它解释得更清楚。
减少意味着对表达式应用减少规则。 (也在链接中)。
α-转换:改变绑定变量(alpha);
β-约简:将函数应用于其参数(beta);
正常顺序:
最左边、最外面的 redex 总是首先被减少。也就是说,只要有可能,在减少参数之前,都会将参数替换到抽象的主体中。
直呼姓名
按照正常顺序,但在抽象内部不执行任何缩减。例如,根据此策略,λx.(λx.x)x 是正规形式,尽管它包含 redex (λx.x)x。
范式是一个等价表达式,根据该形式所施加的规则不能进一步简化
在同一篇文章中,他们谈到了按值调用
仅减少最外层的 Redex:仅当 Redex 的右侧减少为某个值(变量或 lambda 抽象)时,Redex 才会减少。
和应用顺序:
最左边、最里面的 redex 总是首先被减少。直观上,这意味着函数的参数总是在函数本身之前被减少。
您可以阅读我链接的文章以获取有关 lambda 演算的更多信息。
还编程语言基础 http://homepage.cs.uiowa.edu/%7Eslonnegr/plf/Book/Chapter5.pdf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)