在下面的简单代码中,从二叉搜索树中删除元素的函数定义的一部分:
deleteB x (Node n l r) | x == n = Node (leastB r) l (deleteB (leastB r) r)
Run Code Online (Sandbox Code Playgroud)
编译器是否优化了代码,以便它只调用(至少B r)一次,就好像它是:
deleteB x (Node n l r) | x == n = Node k l (deleteB k r)
where k = leastB r
Run Code Online (Sandbox Code Playgroud)
?
换句话说,编译器是否能够理解由于参数r在函数deleteB的主体内没有改变,因此调用相同函数(leastB)的结果不能给出不同的结果,因此它是没用它来计算两次?
更一般地说,如果编译器执行此优化,我将如何理解是否存在令人惊讶的stackoverflow?谢谢