Clojure中如何识别不纯函数

4

我正在学习Clojure和函数式编程(来自Python)。在Clojure中,可以制作不纯的函数,因为可以使用slurp和其他输入方式。是否有一种简单的方法来识别Clojure中的不纯函数,或者将这些函数保留在代码的单独部分是一种惯例?


2
不是很确定,你怎么定义“不纯函数”呢?memoize算不算不纯?那么通过memoize返回的函数呢?或者使用transients内部的引用透明函数呢? - Sam Estep
2
Clojure不是像Haskell一样的纯函数式编程语言。如果这对你很重要,那么Clojure可能不是正确的选择。 - Michiel Borkent
1
@MichielBorkent:对我来说,纯粹并不重要,我只是觉得如果能够将纯粹和不纯的部分分开会很有趣。 - RFV
2个回答

2

理论上,无法确定一个函数是否会产生副作用(由于 Rice 定理)。因此,区分纯函数和不纯函数可能是不可能的。当然,在语法层面上可能有一种方法可以检查函数是否绝对不纯,但我怀疑这实际上在实践中并没有帮助。


1

有一个相当常见的惯例,即以感叹号结尾函数名称(例如swap!),其中该函数在STM事务内不安全使用。这包括IO和许多类型的副作用,因此这里与不纯性有一些重叠,然而,许多不纯的函数也是完全安全的。


请重新措辞“不适用于STM内部”的部分,因为swap是STM的一部分;-)它是完全安全的,只是具有可控的副作用。 - Arthur Ulfeldt
我真的不想看到人们因为认为使用dosync块内的swap!是“不安全”的而避免使用它。我们必须小心在这样的网站上留下会引起谣言的声明。您可以选择一个实际上在STM内使用是不安全的示例,同时明确指出并非所有以!结尾的函数都是如此。 - Arthur Ulfeldt
这不正确。所有与代理和原子的交互都会被保留,直到事务提交,并且仅发送一次给代理和原子。特殊情况是,如果事务出错,则它们将被发送零次。它们保证是安全的。 - Arthur Ulfeldt
谢谢,我会与某本书的作者联系。如果他们要出版这本书,我希望它是正确的。 - z7sg Ѫ
@ArthurUlfeldt 我指的是《Clojure编程》这本书。无论如何,我已经尝试过了,swap!并不像你所说的那样行为。它仍然在事务出错时执行。与alter等不同。 - z7sg Ѫ
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接