函数式编程中如何正确识别纯函数?

问题描述 投票:0回答:1

这个函数是纯函数还是非纯函数?

function greet(name) {
    return "Hi I'm " + name;
}

纯函数的特性是它没有副作用,并且对于相同的输入总是返回相同的输出。

在这里,它会产生副作用(返回一个字符串)。 字符串连接

"Hi, I'm " + name
引入了对外部状态的依赖。杂质是由“嗨,我是”组成的。

我们可以重写下面的代码,使其更加纯净。

//pure function
function pureGreet(greeting, name) {
    return greeting + name;
}

//console output
const hiGreeting     = "Hi, I'm ";

const actualGreeting = pureGreet(hiGreeting, "John");

console.log(actualGreeting);

这个解释正确吗?

javascript function functional-programming
1个回答
0
投票

不,这个解释不正确。

这里,它产生了副作用(返回一个字符串)

不,返回值不是副作用。这就是函数的作用。

字符串

"Hi I'm "
是一个常量,因此不会改变构成引用透明度的特征:

  • 给定相同的输入,它总是返回相同的输出吗?是的。
  • 有副作用吗?没有。

因此它是一个纯函数。

常数只是常数。你可以想象另一个总是在输入上加 2 的函数:

function add2(i) {
    return 2 + i;
}

这也是纯粹的,因为

2
是一个常数。
add2(2)
始终返回
4
add2(3)
始终返回
5
,依此类推。

© www.soinside.com 2019 - 2024. All rights reserved.