javascript - 哈希函数的函数式编程纯度要求

标签 javascript functional-programming purely-functional

我正在按照本指南开始学习使用 Javascript 的函数式编程:https://medium.com/@cscalfani/so-you-want-to-be-a-functional-programmer-part-1-1f15e387e536#.iynj38h83

它将纯函数定义为:

  • 仅对输入参数进行操作
  • 有用的纯函数至少需要一个参数
  • 有用的纯函数必须返回一些东西
  • 纯函数不能改变外部变量/无副作用
  • 给定相同的输入,纯函数总是产生相同的输出

以下函数违反了约定:

function notPure(data) {
  let ts = new Date();
  return md5(data + ts);
}

但以下是纯的:

function pureFunction(data, ts) {
  return md5(data + ts);
  }

假设我理解正确,那有什么意义呢?我对这个领域还很年轻。我还不明白这有什么用。在函数中包含时间戳是否会使函数有状态并破坏纯度?

强制这些值在别处创建并作为参数传递给纯函数有什么好处?

最佳答案

程序总是有状态的。总是。纯函数式编程的想法是将状态(尽可能)推到程序的边缘:例如扫描一行用户输入,对其执行一堆纯函数,并将输出吐回控制台。

这有很多优点:

  • 纯函数易于测试
  • 状态相关的错误隐藏的地方更少
  • 纯函数可以生成非常高效的机器代码。
  • 没有缓存失效。由于函数是引用透明的,您可以随意内存。
  • 它为热代码重新加载等非常酷的东西打开了大门。我不能夸大那有多棒。

那么对于您的示例函数,您将如何测试不纯版本?纯版本很简单,您向它传递一个日期并断言它返回预期的输出。

关于javascript - 哈希函数的函数式编程纯度要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40114684/

相关文章:

javascript - nginx : deactivate cache for html single page app

java - 纯函数和 Java

haskell - Haskell 的纯度是由类型系统或 IO 的实现强制执行的吗?

scala - 有状态的函数管道

javascript - 鼠标悬停且光标指针位于 Y 轴上

javascript - Web AppBuilder for ARCGIS 未知错误 : [TypeError: must start with number, 缓冲区、数组或字符串]

haskell - 如何在 Haskell 中将其更改为 while 循环?

c# - 委托(delegate)中变量的范围

kotlin - 在 Kotlin 中以纯函数式编程风格在 O(n) 时间内计算所有前缀和

javascript - Node.js 启动更新器并关闭主程序