高阶函数返回纯函数

时间:2018-08-22 02:19:32

标签: javascript higher-order-functions pure-function

下面是一个名为functionA的高阶函数的示例,该函数具有customValue作为输入,并返回获取输入并使用该定制值来详细说明结果的函数:

let functionA = (customValue) => {
  let value = customValue || 1;
  return input => input * value;
};

以下是一些结果:

functionA()(4)             
// => returns 4

functionA(2)(4)
// => returns 8

functionA(3)(4)
// => returns 12

functionA(4)(4)
// => returns 16

functionA返回的函数是否可以视为纯函数?

更新:以上示例仅使用数字输入。如@CRice所述,仅当customValue为常量且没有内部状态(如类)时,才可以将返回的函数视为纯函数。

3 个答案:

答案 0 :(得分:23)

使用this definition of Pure Function

  

在计算机编程中,纯函数是具有以下特征的函数:   以下属性:

     
      
  1. 对于相同的参数,其返回值相同(   局部静态变量,非局部变量,可变引用   参数或来自I / O设备的输入流)。

  2.   
  3. 其评估没有   副作用(局部静态变量无突变,非局部   变量,可变引用参数或I / O流)。

  4.   

然后,functionA并不总是返回纯函数。

这里是使用functionA的一种方式,这样它就不会返回纯函数:

let functionA = (customValue) => {
  let value = customValue || 1;
  return input => input * value;
};

class Mutater {
  constructor() {
    this.i = 0;
  }
  valueOf() {
    return this.i++;
  }
}

const nonPureFunction = functionA(new Mutater());

// Produces different results for same input, eg: not pure.
console.log(nonPureFunction(10));
console.log(nonPureFunction(10));

如您所见,在给定相同的输入(10)的情况下,返回的函数会产生不同的结果。这违反了上面定义中的第一个条件(并且使用相同的技巧也可能违反了第二个条件)。

答案 1 :(得分:1)

是的,返回的函数可以认为是纯函数。之所以认为它是纯净的,是因为该函数将始终在给定完全相同的输入的情况下返回相同的输出。

答案 2 :(得分:0)

您返回的函数可以视为纯函数。在您的示例中,实际上有4个不同的纯函数。

const pureFunc1 = functionA();
pureFunc1(4)   // => returns 4
pureFunc1(4)   // => returns 4

const pureFunc2 = functionA(2);
pureFunc2(4)   // => returns 8
pureFunc2(4)   // => returns 8

// ...