我是Clojure的新手,看到过像这样写的匿名函数:
(fn [x] (* x x))
而且也喜欢:
#(* % %)
显然,第二种方式更加简洁。它们之间有什么相关的区别吗?所有匿名函数都可以用任一种风格表示吗?哪种更符合习惯?
与此问题相关的是,我无法确定如何将(fn [x] [x x])
转换为后一种语法。如果能提供一个说明这种情况的文档指针,我将不胜感激。
我是Clojure的新手,看到过像这样写的匿名函数:
(fn [x] (* x x))
而且也喜欢:
#(* % %)
显然,第二种方式更加简洁。它们之间有什么相关的区别吗?所有匿名函数都可以用任一种风格表示吗?哪种更符合习惯?
与此问题相关的是,我无法确定如何将(fn [x] [x x])
转换为后一种语法。如果能提供一个说明这种情况的文档指针,我将不胜感激。
(fn ...)
可以被嵌套,#()
不能。(fn [x y] ...)
等方式来更好地命名参数,而不是使用 %
, %2
, %3
等。(fn ...)
可以为递归使用命名函数,例如 (fn fib [n] (if (<= n 1) 1 (+ (fib (- n 1)) (fib (- n 2)))))
(fn [...] ...)
更容易进行代码生成/操作,因为 #()
是一个读取宏,而不是 Clojure 的常规形式。#()
更加简洁。但如果这是一个主要考虑因素,那么您可能有错误的优先级 :-)(fn [...] ...)
#()
,例如 (map #(+ 2 %) (range 10))
(comp func1 func2)
或 (partial func param1 param2)
等。fn
允许您为函数命名,以便它们可以在函数体内引用,例如:(def fact (fn f [x] (if (= 1 x) 1 (* x (f (dec x))))))
。 - Gabriel Mitchellcomp
和partial
的建议。我想知道它们是否存在,因为我在Haskell中很欣赏它们。 - Eric Wilson#([% %])
扩展为 fn [%] ([% %])
(注意括号),这会导致ArityException异常。#(vector % %)
来解决这个限制。另一件事是,如果需要命名参数,则fn是更好的选择。对于#(),您将使用%或更多参数的情况下,使用%1,%2等(还有%&)。惯用语法用于非常短的一次性映射/过滤函数等。
#()形式不能嵌套。