为什么要将匿名函数分配给变量?
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).
但是,当编写实际使用函数参数的代码时,或多或少就是这样做的。只有赋值比运算符的使用更间接地发生。
当我阅读文档或示例时,我经常看到可以将匿名函数分配给变量的想法。为什么我真的要这样做而不是仅仅定义一个新函数?
一些例子:
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).
但是,当编写实际使用函数参数的代码时,或多或少就是这样做的。只有赋值比运算符的使用更间接地发生。