この 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 関数を作成できますか? 純粋な関数が舞台裏で変数を共食いできるように、「これがこの変数への最後の参照です」と表現する方法はありますか?
関数がインライン化された場合、ここで興味深いことは何も起こらないので、呼び出し元と関数が別々にコンパイルされると仮定しましょう。