是否可以使用#,%1,%2代码进行编码?
(defn fib-step [[a b]]
[b (+ a b)])
(defn fib-seq []
(map first (iterate fib-step [0 1])))
user> (take 20 (fib-seq))
(0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181)
简而言之,我想知道如何写作 矢量 - >使用#和%语法糖的矢量函数。
由于
答案 0 :(得分:3)
您可以使用带有#()
线程宏的->
阅读器表单轻松生成向量。例如,以下两个函数是等效的:
(fn [a b] [b a])
#(-> [%2 %])
但是,如果您需要进行解构,就像在您的情况下一样,您最好只使用其中一个带有显式参数列表的fn
表单。你使用#()
得到的最好的就是这样:
#(-> [(% 1) (+ (% 0) (% 1))])
或
#(-> [(% 1) (apply + %)])
使用高阶juxt
函数是创建向量的另一种不错的方法,但不幸的是在这种情况下它也不会给你带来太多收益:
(def fib-step (juxt second #(apply + %)))
我认为在所有选项中,使用fn
仍然是最合适的,因为它很容易支持解构:
(fn [[a b]] [b (+ a b)])
答案 1 :(得分:0)
以下是代码:
(def step #(-> [(% 1) (+ (% 0) (% 1))]))
(def fib #(map first (iterate step [0 1])))
(println
(take 20 (fib))
)
或
(def step #(-> [(% 1) (+ (% 0) (% 1))]))
(def fib (->> [0 1]
(iterate step)
(map first)))
(println
(->> fib
(take 20))
))
答案 2 :(得分:0)
我建议让fib-step
取2个参数而不是矢量,因为这会使事情更清楚,这个函数需要两个值,而矢量作为参数意味着它可以将任意数量的值作为参数(在矢量的形式)。
(def fib-step #(-> [%2 (+ %1 %2)]))
(defn fib-seq []
(map first (iterate (partial apply fib-step) [0 1])))
答案 3 :(得分:0)
我认为使用vector
函数比(-> [...])
“技巧”更清晰:
#(vector (% 1) (apply + %))
虽然在这种情况下,通过解构,我只会使用命名函数或(fn [...] ...)
。