高阶函数返回纯函数。

21

这是一个名为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

函数A返回的函数可以被认为是纯函数吗?

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


5
社区内就“纯函数”究竟是什么存在着一场健康、有意义的讨论。其中一个(过于?)简化的定义是“无副作用”——即在函数范围之外不会对变量/状态产生影响,导致在相同输入下函数有不同效果。你的函数A绝对符合这个标准。我认为是的。 - Andy Taton
4
如果你只考虑合理的输入,即 number(或现在的 BigInt) - 参见 CRice 的答案 - 那么它是纯粹的。 - Ry-
2
有些好心的人点赞了我的评论,但很明显我误解了问题。你并没有问“functionA是纯函数吗?”,而是“由于functionA,返回的函数是否总是纯函数?”正如下面其他人所回答的,我认为对于这个第二个问题的答案是“不是”。 - Andy Taton
针对OP:不要将答案编辑到问题中。如果想回答,请发表一个答案。 - user202729
@pnknrg 不仅返回的函数是纯函数,整个 functionA 也应该被视为纯函数。 - Bergi
显示剩余3条评论
3个回答

23

使用纯函数的定义:

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

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


8
那么我们可以说,只要customValue没有内部状态,那么由functionA返回的函数就是纯函数。对吗? - Francesco Meli
我认为可以,只要customValue是常量。但你也可以将mutator作为参数传递给返回的函数,以进行相同类型的操作。但这是否仍然算作“相同的输入”?我不知道。 - CRice
@pnknrg 从流中读取数据是否被视为“内部状态”?我认为你可以只使用维基百科的定义,来判断如果customValue是纯的,则functionA就是纯的。 - Max Langhof
只要你在JS中有可变数据类型,比如Object,你就不会拥有纯函数。JS只是一种试图实现函数式编程范例的玩具语言。但是对于像String这样的原始数据类型,情况可能并非如此。 - Redu

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

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

// ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接