函数println在Clojure中为什么不是纯函数?

6

它总是返回nil

这难道不意味着它是纯的吗?

println会引起任何副作用吗?


5
是的,它会引起打印,这是一个副作用。因此它不是纯的。 - jmargolisvt
任何除了返回值以外的操作的函数都不是纯函数。 - m0skit0
1
任何返回 nil(或其它语言中的同义词,如 null、void、None 等)的函数都是不纯的或无意义的,这不仅适用于 Clojure。 - Jared Smith
2个回答

6

副作用可以大致定义为“修改任何不属于函数本身的状态”。这包括写入磁盘或进行某种外部API调用等。由于println会写入STDOUT,因此它会改变stdout的状态。因此,它具有副作用。


只是想在这里澄清一下,读取/写入内存不算作副作用。 - swlkr

4

它总是返回 nil

这难道不意味着它是纯的吗?

只有当它没有副作用时,才意味着它是纯的。

println 会引起任何副作用吗?

是的,它会打印信息。

如果它没有副作用,那么它将非常无聊,因为它也不会返回任何有意义的内容。

我更喜欢使用术语引用透明性而不是纯度。如果一个表达式或函数是引用透明的,那么你可以用它的值替换它(反之亦然)而不改变程序的含义。这意味着,println 是引用透明的 当且仅当 我可以用 nil 替换任何出现的 println 或用 println 替换任何出现的 nil 而不改变程序的含义。显然,你不能这样做,因此,println 不是引用透明/纯的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接