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

Functional Programming Purity Requirements for Hash functions

本文关键字:函数 哈希 编程      更新时间:2023-09-26

我遵循这个指南开始学习函数式编程w/Javascript: https://medium.com/@cscalfani/so-you- wanna -to- a- function-programmer-part1-1f15e387e536 #.iynj38h83

它将Pure函数定义为:

  • 只对输入参数操作
  • 纯函数至少接受一个参数
  • 有用的纯函数必须返回一些东西
  • 纯函数不能改变外部变量/无副作用
  • 对于相同的输入,纯函数总是产生相同的输出

下面的函数违反了契约:

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

但是下面是Pure:

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

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

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

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

这有很多优点:

  • 纯函数易于测试
  • 状态相关的bug隐藏的地方更少
  • 纯函数可以生成非常高性能的机器码。没有缓存无效。因为函数是引用透明的,你可以随意记忆。
  • 它打开了真正酷的东西的大门,比如热代码重载。我不能夸大这有多棒。

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