有没有任何副作用但非参考透明度的功能的例子?

时间:2017-04-30 06:18:57

标签: side-effects

我知道副作用和非参照透明度意味着不同的东西。  "副作用,这意味着一些违反参考透明度的行为。" "参照透明度意味着表达式(例如函数调用)可以用其值替换; "

但是,我想知道是否有任何功能的例子没有副作用但是没有参考透明度 如果是,有人会给我一个例子(例如在C函数中)

3 个答案:

答案 0 :(得分:2)

考虑一个询问外部环境的函数,例如返回当前时间或硬盘上的可用空间等。

答案 1 :(得分:1)

你在问:

  

我想知道是否有任何功能的例子没有副作用但是非参考透明度如果是的话,是否有人会给我一个例子

以下是一个例子:

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)的两次调用会产生两个不同的值)。

答案 2 :(得分:0)

参照透明度意味着没有副作用:如果你能用它返回的值替换函数,那么就没有副作用:该函数只能根据传递给它的值计算一个值。

声明"副作用意味着没有参考透明度"只是上述的对立面,在逻辑上等同于它。