Clojure中副作用的含义

Clojure中副作用的含义,clojure,side-effects,Clojure,Side Effects,我在思考Clojure中副作用的含义。Clojure的副作用到底是什么?任何人都可以用一个例子来解释这一点吗?在任何编程语言中,如果所提供的参数和返回的结果之间没有直接关联,那么所做的一切都会产生副作用 (+ 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

我在思考Clojure中副作用的含义。Clojure的副作用到底是什么?任何人都可以用一个例子来解释这一点吗?

在任何编程语言中,如果所提供的参数和返回的结果之间没有直接关联,那么所做的一切都会产生副作用

(+ 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和对象突变。

在任何编程语言中,函数的副作用都是除了返回结果之外的任何结果。对于所有具有参数和返回值的对象,而不仅仅是函数,这是正确的。Java字符串类是功能性的,它的每个方法也是功能性的。原因是每个String对象都不提供任何方法来改变其内部状态。此外,Scheme没有函数,只有过程。当然,这和函数是一样的,但是你不会看到很多使用函数这个术语的方案问题的答案。那么说第一个表达式是纯函数,而第二个表达式有副作用,对吗?为什么
println
也有副作用(我在某处读到过…)你的答案,你的选择。在我看来,Java方法是附加到类的函数,Scheme的过程只是函数的另一个名称。@teymuri否。我只展示了应用程序
+
是一个纯函数,
rand int
(和
println
)不是。这一点已经足够清楚了,尽管它可能太宽泛了。这当然不是Clojure特有的。