我一直在阅读有关函数式编程的文章,并对某些情况下对程序的影响感到好奇。
对于我当前的情况,我在C中有一个向量(双精度数组),并且经常在需要“返回向量”的计算中使用该向量,但是我不想分配额外的内存,因此我使用签名例如
void compute(vector* input, vector* output);
我在同一个输入向量上使用别名来保存输出,而不必为新的输出向量分配额外的内存。
现在,对于函数式编程,我的经验仅限于Mathematica编程语言和一些普通的口齿不清,但我对此可能产生的效果感到好奇。假设我有一个向量v,并且用一种功能语言编写了相同的计算程序。在Mathematica中,我要声明:
v = compute(v)
在其他标准功能语言中,根据我对阅读的理解,这些对象是不可变的,因此v不应更改,并且v将被重新分配为新向量,从而取消分配旧向量。我想知道我的理解是否正确,如果不正确,会发生什么而不是我的误解。我知道延迟评估,并且还想知道在使用和不使用延迟评估的情况下,这些系统会有什么不同。
谢谢。
编辑1:询问有关我来自哪里的具体情况。我正在研究的一个项目是光线跟踪器,在这种情况下,通常我需要请求用于照明的矢量信息或达到此目的的东西,此数据通过传递给函数的指针存储,而目标存储矢量为在功能之外分配。我对函数式编程的理解是,正如我发表的评论一样,当我做类似的事情时,由于向量将是不可变的,因此我无法将指向该函数的指针传递给要修改的向量,而该函数将返回新分配的向量:
v =计算(v)
v将是新分配的向量。我最初的问题是该声明的准确性,并且正如有人发布了对此声明的支持那样,我的下一个问题不是认为这可能是浪费内存的问题吗?
本文对不可变的函数式编程范例中涉及的数据结构编程进行了很好的描述
http://www.infoq.com/articles/in-depth-look-clojure-collections
C的问题在于,使用不可变的概念确实需要很多纪律。话虽如此,有些方案虚拟机是用C实现的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句