[由于答案中缺少 # 被编辑]
这种方法不太妥当,因为 constantly
旨在允许任意数量的参数,并总是返回一个常量。#(...) 匿名函数简写提供了一种快速定义匿名函数的方法,该函数适用于各种归约(arity)
0 - #(vector)
1- #(vector %1)
2 - #(vector %1 %2)
...
n - #(vector %1 %2 ... %n)
& args - #(apply vector %&)
然而,由于您在定义函数体,这会有一些限制...如果您尝试定义类似 identity 的内容,它最终会看起来像一个调用...
#(%)
;; 这将尝试将单个参数视为一元函数进行调用。
可以通过将输入绑定到 let 或其他形式来解决此问题,以传达归约...
#(let [v %] v)
或者
#(do %)
将像 identity 一样工作,我们只需要在体中返回它。
但我们想定义一个可变参数的函数,因此我们想用 %& 来指示参数。然而,对于结果来说,参数是没有意义的...它们唯一传达给匿名函数糖的只是参数的数量或归约。
虽然有些尴尬,但这是其中一种方法
(defn constantly2 [v]
;;ignore the arguments, but communicate a varargs function
#(let [_ %&]
v))
user=> (def f (constantly2 10))
#'user/f
user=> (f 1 2 3 4)
10
user=> (f 1)
10
user=> (f 5)
10
user=> (f :a)
10
我可能不会在这些事物上使用#(..)语法糖。这种简写对于非常简单的内联匿名函数很有用,即使在那时,我也通常更喜欢明确写出fn
。