2015-08-08 46 views
1

我一直在思考Clojure中副作用的含义。 Clojure的副作用究竟是什么?有没有人可以用一个例子来解释这一点?Clojure中副作用的含义

+0

这很清楚,虽然它可能太宽泛。这当然不是特定于Clojure。 – Thumbnail

回答

6

任何编程语言的副作用都是所做的一切,它们在提供的参数和返回的结果之间没有直接关联。

(+ 3 4)  ; ==> 7 (result is always a mapping between arguments and result. It will always be 7 no matte rhow many times you do it. 
(rand-int 4) ; ==> 0,1,2, or 3. You have no idea what it will produce next. 

第一个表达式是功能性的。你可以用它的结果制作一个包含所有不同的两个值的查找表,你不知道它们的区别。

第二个可能会给同一个论点的结果不同。计算必须基于其他内容,如内部状态,而不仅仅是参数。它有副作用。

程序中使用的典型副作用是I/O和对象变异。

+0

如何“在任何编程语言中,函数*的副作用*是除了返回结果之外的任何事情。”? – Thumbnail

+0

@Thumbnail一切都有参数和返回值,而不仅仅是函数。例如。 Java String **类**是有效的,它的每一个**方法**都是有效的。原因是每个String对象都不提供任何改变其内部状态的方法。此外,方案没有功能,但程序。它与当然的功能相同,但使用术语“功能”时,您不会看到许多Scheme问题的答案。 – Sylwester

+0

所以说,第一个表达式是纯函数,而第二个表达式有副作用?为什么'println'也被称为有副作用(我在某处读过......) – amirteymuri