函数println怎么不纯? (Clojure)

How is the function println not pure? (Clojure)

总是returns

那不是说它很纯吗?

println 会产生副作用吗??

It always returns nil.

Doesn't that mean it's pure?

只有没有副作用才说明是纯的

Does println cause any side effects??

是的,打印出来了。

如果它没有副作用,那会很无聊,因为它也 return 没有任何意义。

比起纯度,我更喜欢术语参考透明度。如果您可以用它的值替换它(反之亦然)而不改变程序的含义,则表达式或函数是引用透明的。这意味着 println 是引用透明的 IFF 我可以用 nil 替换任何出现的 println 或用 println 不改变程序的意思。显然,你不能那样做,因此,println 不是引用透明的/纯粹的。

副作用可以大致定义为“修改函数本身不包含的任何状态”。这包括写入磁盘或进行某种外部 API 调用等。由于 println 写入 STDOUT,它正在改变标准输出的状态。所以它有副作用。