问题标签 [referential-transparency]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
programming-languages - 如果编程语言中的所有内容都是表达式,它会是参照透明的吗?
我已经在某个地方做好了准备,尽管经过大量搜索后我找不到它,如果有人在哪里创建一种新的编程语言,那么在一切都是表达式的情况下,它将是完全引用透明的。
一些关于引用透明性的问题表明,某些语言,如 Ruby 和 Perl,几乎所有东西都是表达式。
这可能/是否存在?
如果我理解它,那么如果一种编程语言是完全引用透明的,这是否意味着根本没有副作用,是否有可能拥有一种没有副作用的完整编程语言?
标题的主要问题是,如果目标是创建一种完全引用透明的编程语言,那么一切都是表达式吗?
java - 当 Java8 使用引用透明时
我们注意到 java 8 使用参照透明 :
我测试了很多代码来检测这个 RT,例如:
安慰 :
我注意到 Java 8 运行三重方法,即使有一个元素出现了两次,即3
.
正如 Istvan 解释的那样,我的问题 是:
如果 Triple 是引用透明的,为什么编译器不优化对 Triple(3) 的重复调用?
matlab - Matlab 中的多输出函数究竟返回了什么?
免责声明:我实际上使用的是 Scilab,但它与 MATLAB 非常相似,根据我的研究,MATLAB 似乎也发生了同样的现象。
在 MATLAB 中,函数可以是多输出的。假设我们有一个函数function [a, b] = f(x)
。如果我输入:
然后c
给出第一个输出的值。如果我输入:
然后[a, b]
给出两个输出对的值。这似乎暗示 MATLAB 没有引用透明性。表达式的实际值是f(x)
多少?这是怎么回事?
haskell - 类型推断干扰了引用透明度
Haskell 语言在引用透明度方面提供的确切承诺/保证是什么?至少 Haskell 报告没有提到这个概念。
考虑表达式
我想知道这个表达式是否为 1。为了我的安全,我会执行两次:
现在提供(True,False)
GHCi 7.4.1。
显然,这个表达式现在在引用上是不透明的。我如何判断一个程序是否会受到这种行为的影响?我可以将整个程序淹没,::
但这并不能使它变得非常可读。我想念的还有其他类别的 Haskell 程序吗?那是在完全注释和未注释之间?
(除了我在 SO 上发现的唯一有点相关的问题之外,这上面肯定还有其他问题)
scala - 我对可变类的“引用透明度”的理解是否正确?
从“scala中的函数式编程”一书中,我看到了一个表达式的“引用透明”的定义:
如果对于所有程序 p,表达式 e 是指代透明的,如果 p 中所有出现的 e 都可以替换为 e 的计算结果而不影响 p 的含义。
我有一些代码示例,我不确定它们是否具有引用透明性。
我将scala.collection.mutable.StringBuilder
在示例中使用可变类
1.
假设这里的代码是使用x
.
我可以说表达式x
是引用透明表达式吗?
如果我x
用它的 value改变 all new StringBuilder("Hello")
,程序的可观察行为不会改变:
2.
假设这里的代码是使用x
和的完整且完整的代码y
。
我可以说y
是参照透明的,因为它根本没有在程序中使用吗?
3.
我可以说x
是参考透明的吗?因为无论我如何用它的值替换它,返回值都不会改变。
PS:也许主要问题是我不明白是什么for all programs p
意思,是指现有的完整代码吗?或者任何可能添加的代码?
scala - return 会破坏引用透明度吗?
我正在阅读Scala WartRemover工具的描述,并被他们的观点之一弄糊涂了。描述是这样说的:
return
打破了参照透明度。重构以安全的方式终止计算。
这对我来说没有任何意义,而且这两个例子看起来都是透明的。关键字是否有某种方式return
使函数更有可能破坏引用透明度?我只是完全误解了他们的观点吗?
r - 嵌套 R 函数的范围
我有一个例子,我不确定我是否理解 R 中的作用域,也不认为它在做正确的事情。该示例由 J. Fox 修改自“An R and S-PLUS Companion to Applied Regression”
我在列表中所期望的三个函数分别计算恒等函数、平方函数和立方函数,但它们都将它们的参数立方化。如果我不使用 lapply,它会按预期工作。
我是唯一一个觉得这令人惊讶或不安的人吗?是否有一个深刻的令人满意的理由?谢谢
PS:我在 Google 和 SO 上进行了搜索,但是,可能由于与此问题相关的关键字的普遍性,我空手而归。
PPS:这个例子的动机是包 quickcheck 中的一个真正的错误,而不是纯粹的好奇。我有一个解决该错误的方法,感谢您的关注。这是关于学习的东西。
当然,在发布问题后,我想到了一个可以澄清问题的不同示例。
p 与隐藏在 lapply 中的循环变量具有相同的作用。p 由一个方法传递,在这种情况下,该方法看起来像对 make.power 的引用。Make.power 不评估它,只是保留一个指向它的指针。我在正确的轨道上吗?
scala - 例外和参考透明度
阅读“Scala 中的函数式编程”,我对不具有引用透明性的异常部分感到有些困惑。
给出的例子是
所以书中给出的论点y
是引用不透明的,因为如果我们将它替换到try
块中的主体中,我们会得到与直接运行函数不同的结果。这对我来说没有任何意义,因为整个函数一开始就没有终止,所以说函数体内的值不是引用透明的有什么意义呢?在我看来,天真的替换如下
并且仍然失败,但有同样的例外。
此外,y
它本身是一个非值(它不能直接被评估为一个值),那么谈论这些表达式的引用透明性有什么意义呢?我怀疑这里有某种花招,所以我的推理到底在哪里不正确?
haskell - 如何不纯地修改与对象关联的状态?
在 Haskell 中,我有一个容器,例如:
这个容器是一棵扁平的树。它的访问器通过向量(!)
执行二进制 ( log(N)
) 搜索,以便找到存储的正确存储桶index
。
由于连续访问可能在同一个桶中,因此可以通过以下方式进行优化:
棘手的一点是last accessed bucket
零件。在 JavaScript 中,我只是不纯地修改了容器对象上的隐藏变量。
由于这只是一种优化,并且结果与所采用的分支无关,因此我相信它不会破坏引用透明度。在 Haskell 中,如何不纯地修改与运行时值相关的状态?
~
我想到了两种可能的解决方案。
一个全局的、可变的 hashmap 链接指向该
lastBucket
值的指针,并使用 unsafePerformIO 对其进行写入。但是我需要一种方法来获取对象的运行时指针,或者至少是某种唯一的 id(如何?)。在 , 中添加一个额外的字段
Container
,lastBucket :: Int
并以某种方式在 中不纯地修改它(!)
,并认为该字段是内部的(因为它显然破坏了引用透明度)。