为什么是最外部的redex?

问题描述 投票:1回答:1

我一直在阅读《赫顿的Haskell编程》一书。

这是本书中有关延迟评估的练习之一:

1。确定以下表达式中的redex,并确定每个redex是最里面,最外面,两者都不是,或两者都是:

a。 1 +(2 * 3)

b。 (1 + 2)*(2 + 3)

由于这是教科书中的问题,我检查了答案,并显示:

a。 1+(2 * 3)中唯一的redex是2 * 3,它是最内层和最外层。

我完全理解2 * 3是最里面的事实,因为括号中没有其他redex。但是为什么2 * 3最外面的redex?如果我没记错的话,最外面的redex

b。 (1 + 2)*(2 + 3)中的redex为1 + 2和2 + 3,第一个为最内层。

然后,b的答案表明,只有1 + 2是最内层,而2 + 3是最内层或最外层。

阅读此问题后,我对最外层和最内层redex之间的主要区别感到困惑。任何帮助将不胜感激,谢谢。

haskell lazy-evaluation
1个回答
0
投票

Hutton在这里的介绍和定义非常令人困惑。在本章的上下文中,+*操作被视为严格的原始函数,因此仅当a + b和[C0都使用时,表达式a * ba才是可归约的(因此是redex)。 ]是数字。

正如他定义它们一样,最里面的redex是最左边的redex,不包含其他redex。最外面的redex是没有其他redex包含的最左边的redex。

在(a)部分中,唯一的redex是b。它位于最内层,因为它不包含任何其他redex,也位于最外层,因为它不包含在其他redex中。

在(b)部分中,唯一的代表是2*31+2。都不包含其他redex,也不包含在另一个redex中。由于通过选择最左边的redex打破了联系,因此2+3显然是他定义中最里面和最外面的redex。因此,教科书的答案似乎是错误的。

无论如何,我不会流汗。这是本章中最不重要的练习。

© www.soinside.com 2019 - 2024. All rights reserved.