我已经阅读了这里的一些讨论,以及其他解释的链接,但我仍然无法理解“改变状态”和“不改变状态”之间的数学联系,因为它与我们的函数式编程与非 FP 辩论。据我了解,基本论点可以追溯到函数的纯数学定义,即函数仅将域成员映射到一个范围成员。然后将其与给定某个输入的计算机代码函数进行比较,它始终会产生相同的输出,即不会因使用而异,即函数的状态,如在其域到范围的映射行为一样,不会改变.
然后它在我的脑海中变得模糊不清。这是一个例子。假设我想在 xy 字段上显示封闭的块状多边形。在 GIS 软件中,我了解所有内容都存储为有向封闭图,即一个正方形是四个向量,它们的头和尾相连。原始数据表示只是每个向量的各个笛卡尔起点和终点。当然,软件中可能有一个函数可以“处理”所有这些坐标集。好的。但是以数学方式表示每个多边形怎么样,例如,正 x、负 y 象限中的矩形可能是:
Z = {(x,y) | 3 <= x <= 5, -2 <= y <= -1}
所以我们会有很多类似 Z 的函数,每个函数都表示一个单独的多边形——而不是我的矩阵数学专家,也许这些“函数”可以表示为矩阵。. . 但我离题了。
因此,使用通常的原始矢量数据方法,我的代码中有一个函数“改变状态”,因为它处理每组坐标,然后绘制每个多边形(然后处理多边形的变化),而一个和-only-one-one-Z-like-function-per-polygon 方法似乎完全遵守“不改变状态”规则。正确的?还是我离这儿很远?似乎老式的单功能处理原始坐标数据也没有改变域范围纯度法。我很困惑....
我的部分灵感来自于阅读有关图像处理的新想法,其中每个“帧”将由一个能够“绘制”整个图像、边缘、颜色、渐变、等等。这是密切相关的吗?我想我试图理解为什么我要以一种或另一种方式表示多边形(例如城市街区)的街道地图。我一直听到函数式语言的拥护者围绕这样的想法跳舞,即数学函数是纯粹的、安全的、好的,最终是乌托邦式的,而非 FP 软件函数是某种马虎的杂物,使我们远离博格式的幸福。
但更令人困惑的是内存管理相对于 FP 与非 FP。我一直听到的(例如并行编程)是 FP 不会像 C/C++ 程序那样改变“内存状态”。这是否像 Google 文件系统一样,实际上所有内容都只是放在虚拟内存池中,而不是数据移入和移出数据库和内存位置?不知何故,所有这些事情都是相关的。因此,看起来完美的 FP 程序只是一个单一的函数(可能由许多子函数组成)执行一个单一的任务——尽管快速浏览任何 elisp 代码似乎是对精神分裂症编程的研究。