我非常喜欢用不可变值编程的Clojure /函数方法。
但是我不确定是否应该将delay视为不可变值(假设您延迟了纯函数)。我对更大的不可变数据结构中存在一个或多个延迟的情况特别感兴趣。
e.g。包含延迟的向量:
[1 2 (delay (reduce + (range 1000)))]
据我所知,这种行为似乎是一个不可变的值,在你强制进行评估之前你无法看到延迟的结果 - 然后结果被缓存并且值永远不会改变之后。
以这种方式将延迟视为不可变值是否存在任何问题?
答案 0 :(得分:3)
延迟模拟通常称为 thunk 的内容,这是对尚未被评估的表达式的引用,该表达式在被强制后被其结果替换,之后是不可变的。 Haskell使用这种内部可变的thunk来模拟非严格的评估。表达式[1, 2, foldl1 (+) [0..1000]]
名义上与在严格评估的语言中明确延迟的等价物相同。
当然,在延迟对象中使用的函数是纯粹的,将它视为不可变是没有害处的。您可以通过以下几种方式来考虑这一点:
根据定义,纯函数可以替换为其结果。
本地变异(在这种情况下,延迟对象)不会使函数不纯。
当然,Clojure并不区分纯函数和不纯函数,因此作为一名开发人员,您需要对它有所了解。
答案 1 :(得分:1)
delay
是一个“值生成器”,与函数是一个值生成器,只是delay
使“值生成器代码”懒惰地执行,即当它被要求输入值时,而不变性是正在生成的值的属性,因此可以认为生成的值与函数调用一样是不可变的。这是关于产生的值,但是如果你的功能是做副作用,那么你可以有其他问题,但产生的价值仍然是不可变的