我正在学习Clojure和函数式编程(来自Python)。在Clojure中,可以制作不纯的函数,因为可以使用slurp和其他输入方式。是否有一种简单的方法来识别Clojure中的不纯函数,或者将这些函数保留在代码的单独部分是一种惯例?
我正在学习Clojure和函数式编程(来自Python)。在Clojure中,可以制作不纯的函数,因为可以使用slurp和其他输入方式。是否有一种简单的方法来识别Clojure中的不纯函数,或者将这些函数保留在代码的单独部分是一种惯例?
理论上,无法确定一个函数是否会产生副作用(由于 Rice 定理)。因此,区分纯函数和不纯函数可能是不可能的。当然,在语法层面上可能有一种方法可以检查函数是否绝对不纯,但我怀疑这实际上在实践中并没有帮助。
有一个相当常见的惯例,即以感叹号结尾函数名称(例如swap!
),其中该函数在STM事务内不安全使用。这包括IO和许多类型的副作用,因此这里与不纯性有一些重叠,然而,许多不纯的函数也是完全安全的。
dosync
块内的swap!
是“不安全”的而避免使用它。我们必须小心在这样的网站上留下会引起谣言的声明。您可以选择一个实际上在STM内使用是不安全的示例,同时明确指出并非所有以!结尾的函数都是如此。 - Arthur Ulfeldtswap!
并不像你所说的那样行为。它仍然在事务出错时执行。与alter
等不同。 - z7sg Ѫ
memoize
算不算不纯?那么通过memoize
返回的函数呢?或者使用transients内部的引用透明函数呢? - Sam Estep