首页 > 解决方案 > 为什么它是最外层的redex?

问题描述

我一直在阅读“Hutton 的 Haskell 编程”一书。

这是书中关于惰性评估的练习之一:

1. 识别以下表达式中的 redex,并确定每个 redex 是最内层、最外层、两者都不是,还是两者都有:

一个。1 + (2*3)

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

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

一个。1+(2*3) 中唯一的 redex 是 2*3,既是最内层也是最外层。

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

湾。(1+2)*(2+3) 中的 redexes 是 1+2 和 2+3,第一个是最里面的。

那么 b 的答案表明只有 1+2 是最内层,而 2+3 是最内层和最外层。

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

标签: haskelllazy-evaluation

解决方案


赫顿在这里的介绍和定义相当混乱。在本章的上下文中,+and*操作被认为是严格的原始函数,因此表达式a + bor仅当and都是数字a * b时才可约化(因此是 redex) 。ab

正如他定义的那样,最里面的 redex 是最左边的 redex,它不包含其他 redex。最外面的 redex 是不包含在其他 redex 中的最左边的 redex。

在 (a) 部分中,唯一的 redex 是2*3. 它是最里面的,因为它不包含其他的redexes,它是最外层的,因为它不包含在其他redexes 中。

在 (b) 部分中,唯一的变通是1+22+3。既不包含其他 redex,也不包含在另一个 redex 中。由于通过选择最左边的 redex 来打破联系,1+2根据他的定义,它显然是最内层和最外层的 redex。因此,教科书的答案似乎是错误的。

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


推荐阅读