Clojure 是否应将延迟视为不可变值?

Clojure 是否应将延迟视为不可变值?,clojure,functional-programming,immutability,lazy-evaluation,Clojure,Functional Programming,Immutability,Lazy Evaluation,我是Clojure/functional方法的忠实粉丝,该方法使用不可变值进行编程 但是我不确定a是否应该被视为一个不可变的值(假设您延迟一个纯函数)。我特别感兴趣的是在一个较大的不可变数据结构中存在一个或多个延迟的情况 e、 g.包含延迟的向量: [1 2 (delay (reduce + (range 1000)))] 据我所知,它的行为就好像它是一个不可变的值,在强制计算之前,您无法看到延迟的结果,然后缓存结果,此后该值永远不会更改 以这种方式将延迟视为不可变值有什么问题吗?延迟模拟了通

我是Clojure/functional方法的忠实粉丝,该方法使用不可变值进行编程

但是我不确定a是否应该被视为一个不可变的值(假设您延迟一个纯函数)。我特别感兴趣的是在一个较大的不可变数据结构中存在一个或多个延迟的情况

e、 g.包含延迟的向量:

[1 2 (delay (reduce + (range 1000)))]
据我所知,它的行为就好像它是一个不可变的值,在强制计算之前,您无法看到延迟的结果,然后缓存结果,此后该值永远不会更改


以这种方式将延迟视为不可变值有什么问题吗?

延迟模拟了通常称为thunk的内容,即对尚未计算的表达式的引用,一旦强制,该表达式将被替换为其结果,并且此后是不可变的。Haskell使用这种内部可变的thunks来模拟非严格的评估。表达式
[1,2,foldl1(+)[0..1000]]
名义上与具有严格求值的语言中显式延迟的等价表达式相同

当然,如果延迟对象中使用的函数是纯函数,那么将其视为不可变的也没有坏处。你可以从以下几个方面来考虑:

  • 根据定义,纯函数可以用其结果替换

  • 局部变异(在本例中是延迟对象)不会使函数不纯

当然,Clojure不区分纯函数和非纯函数,因此作为一名开发人员,您需要认真对待它。

delay
是一个“值生成器”,就像函数是一个值生成器一样,只是
delay
使得“值生成器代码”执行得很慢,即当需要值时,而不可变性是所产生的值的属性,所以它可以很好地考虑所产生的值不变,就像它是函数调用一样。这是关于产生的值的,但是如果你的函数有副作用,那么你可能会有其他问题,但是产生的值仍然是不变的