这段 C 代码在概念上可以描述为创建一个与输入数组相同但以 1 作为第一个元素的新数组:
int* retire_and_update(int* arr) {
arr[0] = 1;
return arr;
}
这是一个纯函数(wink wink nudge nudge),只要不对输入数组及其元素进行进一步引用。C 类型系统不会为我们强制执行,但原则上似乎可以强制执行。
gcc 生成的代码简单高效:
retire_and_update:
movq %rdi, %rax
movl $1, (%rdi)
ret
我们的函数通过在恒定时间内创建一个全新的数组并且不使用额外的内存来实现看似不可能的事情。好的。可以编写一个具有类似数组输入和输出的 Haskell 函数,并且可以用类似的代码有效地实现吗?有没有办法表达“这是对该变量的最后引用”,以便纯函数可以在幕后蚕食变量?
如果函数被内联,那么这里不需要发生任何有趣的事情,所以我们假设调用者和函数将分别编译。