gpt4 book ai didi

functional-programming - 什么是参照透明度?

转载 作者:行者123 更新时间:2023-12-03 04:04:36 24 4
gpt4 key购买 nike

术语引用透明度是什么意思?我听说它被描述为“这意味着你可以用等号替换等号”,但这似乎是一个不充分的解释。

最佳答案

“引用透明度”一词来自 analytical philosophy ,基于逻辑和数学方法分析自然语言结构、陈述和论证的哲学分支。换句话说,它是计算机科学之外最接近我们所说的 programming language semantics 的学科。 .哲学家Willard Quine负责启动参照透明的概念,但它也隐含在伯特兰·罗素和阿尔弗雷德·怀特黑德的方法中。

“参照透明”的核心是一个非常简单明了的想法。术语“所指”在分析哲学中用于谈论表达式所指的事物。它与我们在编程语言语义中所说的“意义”或“外延”大致相同。使用 Andrew Birkett 的示例 (blog post),术语“苏格兰的首都”指的是爱丁堡市。这是“参照物”的一个简单例子。

如果将上下文中的术语替换为指代同一实体的另一个术语不会改变含义,则句子中的上下文是“引用透明的”。例如

The Scottish Parliament meets in the capital of Scotland.



意思是一样的

The Scottish Parliament meets in Edinburgh.



因此,上下文“苏格兰议会 session 于……”是一个引用透明的上下文。我们可以用“爱丁堡”代替“苏格兰的首都”而不改变意思。换句话说,上下文只关心该术语所指的内容,而不关心其他任何内容。这就是上下文“参照透明”的意义。

另一方面,在句子中,

Edinburgh has been the capital of Scotland since 1999.



我们不能做这样的替换。如果我们这样做了,我们会得到“爱丁堡自 1999 年以来一直是爱丁堡”,这是一个很疯狂的说法,并且与原始句子的含义不同。因此,上下文“爱丁堡一直是……自 1999 年以来”似乎是指代不透明的(指代透明的反义词)。显然,它关心的不仅仅是这个词所指的东西。它是什么?

诸如“苏格兰的首都”之类的东西被称为定语,在很长一段时间内,它们并没有让逻辑学家和哲学家感到头疼。 Russell 和 Quine 对它们进行了整理,说它们实际上并不是“指称的”,即认为上述示例用于指代实体是错误的。正确理解“爱丁堡自 1999 年以来一直是苏格兰的首都”是这样说的

Scotland has had a capital since 1999 and that capital is Edinburgh.



这句话不能转化为坚果。问题解决了!奎因的观点是说自然语言是困惑的,或者至少是复杂的,因为它是为了方便实际使用,但是哲学家和逻辑学家应该通过以正确的方式理解它们来使它们变得清晰。参照透明度是一种用于带来如此清晰含义的工具。

这一切与编程有什么关系?其实不是很多。正如我们所说,参照透明度是一种用于理解语言,即分配意义的工具。 Christopher Strachey ,谁创立了编程语言语义领域,在他的意义研究中使用了它。他的基础论文“ Fundamental concepts in programming languages”可以在网上找到。这是一张漂亮的纸,每个人都可以阅读和理解。所以,请这样做。你会开悟很多。他在这一段中引入了“引用透明度”一词:

One of the most useful properties of expressions is that called by Quine referential transparency. In essence this means that if we wish to find the value of an expression which contains a sub-expression, the only thing we need to know about the sub-expression is its value. Any other features of the sub-expression, such as its internal structure, the number and nature of its components, the order in which they are evaluated or the colour of the ink in which they are written, are irrelevant to the value of the main expression.



“本质上”的使用表明斯特雷奇正在对其进行释义,以便用简单的术语来解释它。函数式程序员似乎以自己的方式理解这一段。论文中还有 9 次出现“引用透明”,但他们似乎并不关心其他任何一个。事实上,Strachey 的整篇论文都致力于解释命令式编程语言的含义。但是,今天,函数式程序员声称命令式编程语言在引用上不是透明的。斯特雷奇会在他的坟墓里转身。

我们可以挽救局面。我们说自然语言是“困惑的,或者至少是复杂的”,因为它是为了方便实际使用而设计的。编程语言也是如此。它们是“凌乱的,或者至少是复杂的”,因为它们是为了方便实际使用而设计的。这并不意味着他们需要迷惑我们。他们只需要以正确的方式理解,使用一种引用透明的元语言,以便我们有清晰的含义。在我引用的论文中,Strachey 正是这样做的。他通过将命令式编程语言分解为基本概念来解释命令式编程语言的含义,在任何地方都不会失去清晰度。他分析的一个重要部分是指出编程语言中的表达式有两种“值”,称为 l 值和 r 值。在 Strachey 的论文之前,这一点不被理解,困惑占据了上风。今天,C 的定义经常提到它,每个 C 程序员都明白其中的区别。 (其他语言的程序员是否同样理解它很难说。)

Quine 和 Strachey 都关注涉及某种形式的上下文依赖的语言结构的含义。例如,我们的示例“爱丁堡自 1999 年以来一直是苏格兰的首都”表示“苏格兰的首都”取决于考虑它的时间。这种上下文相关性在自然语言和编程语言中都是现实的。即使在函数式编程中,自由变量和绑定(bind)变量也将根据它们出现的上下文进行解释。任何类型的上下文依赖都会以某种方式阻止引用透明性。如果你试图理解术语的含义而不考虑它们所依赖的上下文,你最终会再次陷入困惑。奎因关心模态逻辑的含义。他认为 modal logic是参照不透明的,应该通过将其转换为参照透明的框架来清理它(例如,通过将必要性视为可证明性)。他在很大程度上输掉了这场辩论。逻辑学家和哲学家都发现克里普克的可能世界语义是完全合适的。类似的情况也存在于命令式编程中。 Strachey 解释的状态依赖和 Reynolds 解释的存储依赖(以类似于 Kripke 的可能世界语义的方式)是完全足够的。函数式程序员对这项研究知之甚少。他们关于参照透明度的想法将被采纳。

[附加说明:上面的例子说明了一个简单的短语,如“苏格兰首都”有多个层次的含义。在一个层面上,我们目前可能正在谈论首都。在另一个层面上,我们可能会谈论苏格兰随着时间的推移可能拥有的所有首都。在正常实践中,我们可以很容易地“放大”一个特定的上下文并“缩小”以跨越所有上下文。自然语言的效率利用了我们这样做的能力。命令式编程语言的效率非常高。我们可以在赋值(r 值)的右侧使用变量 x 来讨论它在特定状态下的值。或者,我们可能会讨论它跨越所有状态的 l 值。人们很少被这些事情弄糊涂。然而,它们可能能够也可能无法精确解释语言结构中固有的所有含义层。所有这些意义层都不一定“显而易见”,正确研究它们是一门科学问题。但是,普通人无法解释这种分层的含义并不意味着他们对此感到困惑。]

下面的一个单独的“后记”将这个讨论与函数式和命令式编程的问题联系起来。

关于functional-programming - 什么是参照透明度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/210835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com