【问题标题】:Higher order function returns pure function高阶函数返回纯函数
【发布时间】:2018-08-22 02:19:32
【问题描述】:

这是一个名为 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 是常量并且没有内部状态(如类)时,才能将返回的函数视为纯函数。

【问题讨论】:

  • 社区中关于“纯”对函数意味着什么进行了健康、有意义的讨论。一个(过度?-)简化的定义是“没有副作用”——对函数范围之外的变量/状态没有影响,这会使函数在相同的输入下产生不同的效果。您的 functionA 绝对符合该标准。我说是的。
  • 一些好心的人支持我的评论,但很明显我误解了这个问题。您没有问“函数A 是纯的吗?”,而是“由于函数A,函数A 返回的函数是否总是纯的?”正如其他人在下面回答的那样,我认为第二个问题的答案是“否”。
  • JS 中的谜题很难用many kinds of overloading available 解决。 (C++ 相同)
  • 对于 OP:不要将答案编辑到问题中。如果您想回答,请发布答案。

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


【解决方案1】:

使用this definition of Pure Function

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

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

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

那么,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) 时会产生不同的结果。这违反了上述定义中的第一个条件(使用相同的技巧,您也可能违反第二个条件)。

【讨论】:

  • 所以我们可以说,只要 customValue 没有内部状态,那么 functionA 返回的函数就是纯函数。对吗?
  • 我会说是的,只要customValue 是不变的。但是您也可以将mutator 作为参数传递给返回函数,以实现相同的恶作剧。但这仍然算作“相同的输入”吗?我不知道。
  • @pnknrg 会读取例如流被认为是“内部状态”?我认为如果customValue 是纯的,则可以坚持使用维基百科的定义来发现functionA 是纯的。
  • 只要你有像 JS 中的 Object 这样的可变数据类型,你就不会有纯函数。 JS 只是一种试图实现函数式编程范式的玩具语言。但是,对于像 String 这样的原始数据类型,情况可能并非如此。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 2016-05-07
      相关资源
      最近更新 更多