0

在 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)

那么部分应用该函数有什么意义,因为它变成了某种全局变量,它是纯粹的,但它不是DETERMINISTIC可以改变的,如果你改变它,其他函数将根据 PI 常数改变结果。

忽略常量——它可以是变量、配置或在现实世界中可以改变的东西。

对我来说,它就像全局数据库对象——如果你改变它,许多函数也会改变输出。

有什么方法可以避免全局范围并使函数成为纯函数,但无需将 PI 传递给每个调用。

如果函数接受超过 2 个参数,那么支持它就变成了噩梦。

谢谢。

4

2 回答 2

3

所以我的问题是偏函数是纯的吗?

是的,它们是纯洁的。

calcArea(Math.PI)并且calcArea(Math.PI + 2)独立的闭包,你错误地指的是

某种全局变量

这种观念是不正确的。每个部分应用程序不与其他应用程序共享某种“全局关闭”。

考虑以下示例:

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). 这就是独立的意思。

其他功能会改变结果

上面的例子证明这是错误的。

那么部分应用该功能有什么意义

答案是通过功能组合实现可重用性。

于 2019-10-16T05:35:31.700 回答
1

我认为混乱来自这样一个事实,即您已将两个不同的功能分配给const具有相同名称的 a。

const calcArea = PI => radius => PI * radius * radius
const aFunction = calcArea(Math.PI)
const aDifferentFunction = calcArea(3.13)

两个不同的函数aFunction&aDifferentFunction都是纯函数,因为在给定相同的半径参数的情况下,它们都将始终返回相同的结果。

像这样定义函数的一个可能优势是,您可以在程序生命周期的不同时刻获得 PI 和半径值。因此,在函数范围内存储对 PI 的引用可能很有用,然后,一旦半径值可用,只需调用此函数,而不知道 PI 来自哪里以及它的值是如何确定的。

于 2019-10-16T05:36:18.023 回答