“从语义上可观察”的副作用到底是什么意思?


11

我对纯函数有疑问。根据Wikipedia页面,纯功能的必要条件之一是:

结果评估不会引起任何语义上可观察到的副作用或输出,例如可变对象的突变或输出到I / O设备。

现在这到底是什么意思。或者更确切地说,我该如何做一个语义上无法观察到的副作用?


2
您不应过多地关注曾经在Wikipedia上可以找到的手工波浪状东西。
Andrej Bauer

1
@AndrejBauer嗯?这是什么手波浪呢?也许不是研究级别的(我不介意是否将其迁移到计算机科学),尽管给出了您的反应,也许没有。
吉尔(Gilles)'所以

我想我只是不喜欢“语义上可观察”的短语。
Andrej Bauer 2014年

1
让我换个说法:“语义上可观察的”和“语义上可观察的”有什么区别?“语义上”只是一个流行词,在这里毫无意义。
Andrej Bauer 2014年

“语义”似乎已经在规划理论的各个领域一些特殊的意义,可能是从语言学/理念,它可以追溯到几十年又名“语法语义VS”进口....也许这是正确的有另一个问题....
VZN

Answers:


11

程序的语义是其行为的模型,它像任何科学模型一样,会忽略您不想学习的方面。

程序执行的极其详细的模型将对执行该程序的计算机的物理行为进行建模,包括执行时间,功耗,电磁辐射等。这些方面很少考虑,因为它们很少相关。尽管如此,它们有时还是很重要:飞机自动驾驶仪的有用模型需要包括运行时信息,信用卡安全性的有用模型需要包括电磁辐射,...

在典型的语义中,诸如时序和功耗之类的副作用被忽略。即使在平凡的设置中(在Haskell解释器提示下键入表达式),结果的打印也有副作用(如果您尝试打印出无限大的对象,这很重要)。如果Haskell解释器的内存不足,这在“现实世界”模型中也是可观察到的副作用,但在有效允许无限计算的Haskell理想模型中却不是。

一个可观察到的副作用是一个其在语义建模。在典型的编程语言模型中,不对内存消耗进行建模,因此,即使您尝试在PC上运行它,也需要1TB存储空间的计算可能是纯净的。

另一种不可观察到的副作用是该功能内部的副作用。我认为,这就是大多数语义学家在谈论不可观察到的副作用时会想到的。考虑一个在内部使用可变数据但不与程序的任何其他部分共享此可变数据的计算。例如,一个列表排序函数可以构建一个与列表具有相同元素的数组,对数组进行排序,然后以最终顺序返回一个包含元素作为数组的列表:该函数的子表达式语义模型表现出优势效果(数组的修改),但函数本身没有外部副作用,因此是纯函数。

举一个更微妙的例子,考虑一个函数,该函数将一些数据写入一个临时文件,然后对其进行清除。在语义上,总是有足够的空间容纳临时文件,而程序不共享临时文件,因此该函数没有副作用。临时文件充当该功能使用的额外内存。在考虑了文件系统完整条件的语义中,该函数具有副作用-由于外部环境,它可能会失败。在允许机器崩溃的语义中,该函数具有副作用:如果在函数执行期间发生崩溃,则可能会留下临时文件。在允许同时执行的程序查看并可能修改临时文件的语义中,该函数具有副作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.