【问题标题】:Functional Programming Purity Requirements for Hash functions哈希函数的函数式编程纯度要求
【发布时间】:2016-10-18 17:39:09
【问题描述】:

我正在按照本指南开始学习使用 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);
  }

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

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

【问题讨论】:

  • 嗯,您从哪里得知第一个版本不纯?对我来说看起来很纯粹:)
  • @niceman 它根本不纯,在相同的输入上给出不同的结果
  • @JaredSmith 啊哈我明白了,new Date() 得到的是当前日期,我的错误
  • 在给定相同输入的情况下始终返回相同输出的函数更容易推理。此外,这种保证允许函数式编程语言使用延迟执行和记忆等策略来提高性能。

标签: javascript functional-programming purely-functional


【解决方案1】:

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

这有很多好处:

  • 纯函数易于测试
  • 与状态相关的错误隐藏的地方更少
  • 纯函数可以生成高性能的机器代码。
  • 没有缓存失效。由于函数引用透明,因此您可以随意记忆。
  • 它为热代码重新加载等真正酷的东西打开了大门。我不能夸大其词。

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

【讨论】:

  • hmmm 我认为 OP 想要一个更具体到他的例子的答案(为什么传递时间戳比创建它更好)
  • 我也不知道 javascript 的虚拟机(无论是 Google V8 还是 spidermonkey 或...)是否像 Haskell 那样优化纯函数
  • 我可以看到组织代码和调试的好处,但这不是纯函数的唯一原因,不是吗?
  • @user1349419 这就像说呼吸不能是氧气的唯一原因,对吧?当然不是,但有足够的理由。
  • @JaredSmith Gotcha。所以我应该将这些视为构建块。对基础的要求。现在它是一个有一些支撑的空洞。以后,这些的价值会显露出来吗?我越能利用这些规则,我就会成为一个更强大的函数式程序员?
猜你喜欢
  • 1970-01-01
  • 2018-10-07
  • 2015-05-17
  • 2011-08-14
  • 2020-10-18
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多