4

我一直在阅读有关函数式编程的内容,我很好奇在某些运行情况下对程序的一些影响。

对于我目前的情况,我在 C 中有一个向量(双精度数组),我经常在计算中使用这个向量,我想要一个“返回向量”,但我不想分配额外的内存,所以我使用签名,例如

void compute(vector* input, vector* output);

我在同一个输入向量上使用别名来保存输出,而无需为新的输出向量分配额外的内存。

现在对于函数式编程,我的经验仅限于 Mathematica 编程语言和一些常见的 lisp,但我很好奇这会产生什么效果。假设我有一个向量 v,我用函数式语言编写相同的计算。在 Mathematica 中,我会有这样的声明:

v = compute(v)

在其他标准函数式语言中,根据我对阅读的理解,这些对象是不可变的,因此 v 不应更改,并且 v 将被重新分配为新向量,从而释放旧向量。我想知道我的理解是否准确,如果不正确,会发生什么而不是我的误解。我知道惰性评估,并且还想知道这些系统在使用和不使用惰性评估的情况下会有什么不同。

谢谢你。

编辑1:询问我来自哪里的具体情况。我正在做的一个项目是光线追踪器,在这种情况下,我通常需要请求照明的矢量信息或类似的东西,这些数据是通过传递给函数的指针存储的,目标存储矢量是分配在函数之外。我对函数式编程的理解是,正如评论所发表的那样,当我做类似的事情时,由于向量是不可变的,我不能将指针传递给这个函数来修改向量,而是函数会返回一个新分配的向量:

v = 计算(v)

v 将是一个新分配的向量。我最初的问题是这个声明的准确性,正如有人发帖支持这个声明,我的下一个问题是这不会被认为是浪费内存的一个可能点吗?

4

1 回答 1

0

本文很好地描述了不可变函数编程范式中涉及的数据结构编程

http://www.infoq.com/articles/in-depth-look-clojure-collections

C 的问题在于,您确实需要大量的纪律才能使用不可变的概念。话虽如此,一些方案虚拟机是用 C 实现的。(请注意,方案不是不可变的,而是功能性的)

于 2013-10-19T03:05:31.860 回答