javascript - 嵌套的纯函数还是纯函数吗?

标签 javascript functional-programming immutability

根据定义,如果满足以下条件,纯函数就是纯函数:

  • 给定相同的输入,将始终返回相同的输出。
  • 没有副作用。
  • 不依赖于外部状态。

所以这是一个纯函数:

function foo(x) {
  return x * 2;
}

foo(1) // 2
foo(2) // 4
foo(3) // 6

这也是一个纯函数(在 JavaScript 上下文中)

Math.floor(x);

Math.floor(1.1); // 1
Math.floor(1.2); // 1
Math.floor(2.2); // 2

问题:如果我们将这 2 个纯函数结合起来,它是否仍被视为纯函数?

// Nested with Math library
function bar(x) {
  return Math.floor(x);
}

// Nested even deeper
function foobar(x) {
  return foo(Math.floor(x));
}

显然,在没有副作用的情况下,它仍然总是在给定相同输入的情况下返回相同的输出,但是从其他上下文(作用域)调用函数是否违反了“不依赖外部状态”的法律?

最佳答案

外部状态不同于外部代码。如果纯函数不能使用外部代码,那么几乎就没有纯函数这样的东西了。即使您所有的函数都是 x * 2,在(许多)纯函数式语言中,甚至 * 也是一个函数。所以即使是这个简单的函数也无法避免调用其他函数。

函数定义或多或少只是语法细节。您可以将外部函数的函数体内联到更长的表达式中。例如:

function foo(a, b) {
    return bar(a) + bar(b);
}

function bar(x) {
    return x * 2;
}

等同于:

function foo(a, b) {
    return a * 2 + b * 2;
}

唯一的区别是代码片段的可重用性和/或可读性和可维护性。不是纯度。

如果函数不引起副作用或不受其自身之外的副作用/状态的影响,则该函数是纯函数。只要它调用的所有代码也符合该规则,它就会保持纯净。

关于javascript - 嵌套的纯函数还是纯函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40280977/

相关文章:

javascript - 使用 Object.assign 对对象所做的更改会改变源对象

javascript - 如何创建带有下拉菜单的按钮

javascript - 如何更改 toggleClass 中的最后位置

Javascript - 如何用空格替换字符串中的所有+

javascript - 单击事件在 IE11 中未触发

haskell - 这个片段如何翻译成 Haskell?

java - 具有 setter/getter 的公共(public)类是否只是一个不可变类?

java - 我应该将 java Stream.map 函数与 switch 语句一起使用吗?

haskell - 函数组合问题

javascript - 如何在 Javascript 中使用共享的、不可变的引用类型跟踪更改