为什么要将匿名函数分配给变量?

Why would I assign an anonymous function to a variable?

当我阅读文档或示例时,我经常看到可以将匿名函数分配给变量的想法。为什么我真的要这样做而不是仅仅定义一个新函数?

一些例子:

Clojure/Lisp

(def add2
    (fn [a] (+ 2 a))
(add2 4) ;; => 6

Python

add2 = lambda e: e + 2
add2(3) # => 5

Scala

val add2 = (x: Int) => x + 2
add2(5) /* => 7 */

显然,这些都是微不足道的例子,但在生产代码中,我通常认为匿名函数是一个 one off 函数,我需要它用于特定的用例(想想更高kinded 类型等)。

任何人都可以解释为什么我要将匿名函数分配给变量吗?是 runtime/compile 时间问题吗?是否有某些性能特征使其受到青睐?

根据 Python Docs:

Semantically, they are just syntactic sugar for a normal function definition.

afaik,lambda 没有特殊的性能特征使其受到青睐。如果您正在考虑将 lambda 用于复杂任务,请三思,使用函数。

始终使用 def 语句而不是将 lambda 表达式直接绑定到标识符的赋值语句。

编辑:添加了 StefanS 的建议

在 Clojure 中,原因是您可以在多个地方使用该函数。事实上

(defn add2 [x] (+ x 2)

只是 shorthand 对于

(def add2 (fn [x] (+ x 2))

我认为它的呈现方式更让 reader 真正理解函数在所述语言中是第一个 class。如果他们只将它们用作其他函数的参数,也许重点可能会丢失。但是以非常类似于值的方式使用它们,作为赋值的右手,或在 lambda 本身上调用方法等,使人们明白这些与数字、字符串、映射或语言中的任何其他值非常相似。

就我个人而言,我不使用这种模式,因为正如其他评论所提到的,它使代码更难阅读和调试,而且在某些情况下,我没有正确的函数声明的全部功能(Python).

但是,当编写实际使用函数参数的代码时,或多或少就是这样做的。只有赋值比运算符的使用更间接地发生。