javascript - 函数式编程的部分函数和全局作用域

标签 javascript functional-programming

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

相关文章:

javascript - 从另一个 HTML/CSS 文件实现代码的方法?

javascript - 具有智能感知的基于 Web 的 html、javascript、jquery 和 css 编辑器?

javascript - 到达特定元素时向上滚动网页

list - 了解 ML 中的 foldl

haskell - 无法将预期类型与实际类型匹配

list - 返回 OCaml 中列表的第 n 个元素?

javascript - 从 JQuery DataTable 中删除行 - 但它会在重绘表后立即返回。我的 .JSP 数据源是原因吗?

javascript - 您如何检查 angularjs 中的 http.get 中的数据是否为空并执行某些操作?

Clojure 惰性序列使用

haskell - 在 Haskell 中自定义列表中的元素相乘