在 FP 中,避免使用全局函数/常量。
所以我的问题是部分函数是纯函数吗?
例如,如果我必须计算圆的面积,我有这样的东西:
const calcArea = PI => radius => PI * radius * radius
所以我可以部分应用它:
const calcAreaCircle = calcArea(Math.PI) //
calcAreaCircle(5) => // 3.13 * 5 * 5 = 78.53981633974483
因此,如果我更改 PI 并再次运行该程序,我将得到不同的结果:
const calcAreaCircle = calcArea(Math.PI+2)
那么,部分应用该函数有什么意义,因为它变成了某种全局变量,它是纯粹的,但不是确定性的,它可以更改,如果您更改它,其他函数将更改结果取决于 PI 常数。
忽略常量 - 它可以是变量、配置或现实世界中可以更改的内容。
对我来说,它就像全局数据库对象 - 如果您更改它,许多函数也会更改输出。
有没有办法避免全局作用域并使函数变得纯粹,但无需将 PI 传递给每个调用。
如果函数接受超过 2 个参数,那么支持它就会变成噩梦。
谢谢。
最佳答案
So my question is are partial functions pure?
是的,它们是纯净的。
calcArea(Math.PI)
和 calcArea(Math.PI + 2)
具有独立的 closures ,您错误地称为
some kind of global variable
这个观念是错误的。每个部分应用程序不与其他应用程序共享某种“全局闭包”。
考虑以下示例:
const mult = x => y => x * y
const times5 = mult(5)
console.log('5 * 4 =', times5(4))
const times3 = mult(3)
console.log('3 * 6 =', times3(6))
console.log('5 * 6 =', times5(6))
请注意,定义 const times3 = mult(3)
不会影响 const times5 = mult(5)
创建的闭包。这就是独立的含义。
other function will change the results
上面的示例证明这是错误。
So what's the point to partially apply the function
答案是通过功能组合实现可重用性。
关于javascript - 函数式编程的部分函数和全局作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58406233/