这种C代码可在概念上被描述为创建新阵列相同的输入阵列,但以1作为第一个元素:Haskell中:使用最后一个引用一个变量以有效地创建一个新的变量
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函数是否可以使用类似的代码有效地实现类似于数组的输入和输出?有没有一种方法可以表达“这是对这个变量的最后一个引用”,这样一个纯函数可以在后台调用变量?
如果函数被内联,那么在这里没有什么有趣的事情需要发生,所以我们假设调用者和函数将被单独编译。
IIUC“独特性类型”,或类似的线性类型,做到这一点。不幸的是,这些不是Haskell类型系统的一个特性。 Haskell中的传统方法是使用[ST' monad](https://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Monad-ST.html)在概念上实现突变纯粹的设置(它暂时进入一个具有可变状态的monad,但类型系统保证计算是确定性的,并且状态不会泄漏)。这与你所谈论的内容完全不同。 – luqui
[Clean](http://clean.cs.ru.nl/Clean)是一种使用唯一类型的函数式语言,也受Haskell的影响。 – chi