有没有没有副作用但非引用透明的函数示例?

is there any example of function that has no side effect but non-referential transparency?

我知道副作用和非引用透明度是不同的意思。 "side effect, which implies some violation of referential transparency." "Referential transparency means that an expression (such as a function call) can be replaced with its value; "

但是,我想知道有没有没有副作用但非引用透明的函数的例子 如果是,谁能给我一个例子(例如在 C 函数中)

引用透明意味着没有副作用:如果你可以用它的值替换一个函数returns就不会有副作用:该函数只能计算一个基于传递给它的值的值。

语句"side effect implies no referential transparency"正好是上面的对立句,逻辑上等价

您在问:

I wonder if there is any example of function that has no side effect but non-referential transparency If yes, would anyone give me an example

这是一个例子:

int globalValue = 0;

 int f(int x)
 {
   globalValue++;
   return x + globalValue;
 }

 int g(int x)
 {
   return x + globalValue;
 }
// assuming the compiler orders the methods to execute from top to bottom
int p = f(1) + // f(1) == 2 , globalValue == 1 : side effect
        g(1) + // g(1) == 2 , globalValue == 1 : no side effect
        f(1) + // f(1) == 3 , globalValue == 2 : side effect
        g(1);  // g(1) == 3 , globalValue == 2 : no side effect

在此示例中,f 执行副作用并且它不是引用透明的,而 g 执行副作用,但是它也是非引用透明的(因为 g(1) 的两次调用产生两个不同的值)。

考虑一个查询外部环境的函数,例如returns当前时间,或者硬盘上的空闲space等