我有以下功能:
def timestamp(key: String)
: String
= Monoid.combine(key, Instant.now().getEpochSecond.toString)
并想知道,如果它是纯粹的或不是?对我来说一个纯函数是,给定相同的输入返回总是相同的输出。但上面的函数,总是给出相同的字符串将返回另一个字符串与另一个时间,这在我看来是不纯的。
答案 0 :(得分:5)
不,我所知道的任何定义都不是纯粹的。这里对纯函数进行了很好的讨论:https://alvinalexander.com/scala/fp-book/definition-of-pure-function。在Alvin对纯度的定义中,他说:
纯函数没有“后门”,这意味着:
...
它不依赖于任何外部I / O.它不能依赖来自文件,数据库,Web服务,UI等的输入;它不能产生输出,例如写入文件,数据库或Web服务,写入屏幕等。
读取当前系统的时间使用I / O,因此它不纯。
答案 1 :(得分:2)
你是对的,它不是纯函数,因为它为相同的参数返回不同的结果。从数学上讲,它根本不是一个功能。
来自维基百科的Pure function的定义
函数始终在给定相同参数值的情况下评估相同的结果值。函数结果值不能依赖于程序执行过程中或程序执行不同时可能发生的任何隐藏信息或状态,也不依赖于I / O设备的任何外部输入(通常见下文)。
- 醇>
评估结果不会导致任何语义上可观察到的副作用或输出,例如可变对象的突变或输出到I / O设备(通常见下文)。