为了这个问题,假设有三件事可以强制一个值被实际评估:
- 该值的模式匹配
- 将值应用于参数
- 使用它作为第一个参数
seq
实际情况稍微复杂一些,但在这里并不重要。
此外,这种强制只发生在某些外部表达式的上下文中,因此与其以某种抽象的方式将这些视为“强制评估”,不如将它们视为使外部表达式的评估依赖于对外部表达式的评估。价值。这就是为什么,例如,在任何意义上seq x x
都不会强制x
,因为无论如何这都是表达式的最终值;它说当评估外部表达式(其值为x
)时,它也应该评估x
,这是多余的。
最后,任何依赖于强制未定义值的值本身就是未定义的。
遍历每个表达式:
seq undef1 () = undefined
在这种情况下undef1
是未定义的,并且seq undef1 x
是一个表达式,其值是x
并且取决于评估undef1
。因此,无论第二个参数seq
是什么,整个表达式都是未定义的。
seq undef2 () = ()
在这种情况下,undef2
不是未定义的,而是应用它的结果。seq undef2 x
是一个表达式,其值为x
并取决于评估undef2
。这不会导致任何问题,并且第一个参数 toseq
被丢弃,所以表达式的值在()
这里。
undef2 () = undefined
在这种情况下,我们undef2
直接申请。表达式undef2 ()
取决于undef2
(这很好) 的评估,并评估应用的结果undef2
,在这种情况下是undefined
.
将此与第四种情况进行对比:
undef1 () = undefined
在这种情况下,我们正在应用undef1
,因此表达式的值取决于评估undef1
,这是未定义的,因此整个表达式也是如此。这与之前使用 的表达式具有相同的“值” undef2
,但原因却截然不同!