Clojure vector - >使用#和%语法糖的向量函数?

时间:2013-07-02 01:25:20

标签: clojure

是否可以使用#,%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)

简而言之,我想知道如何写作  矢量 - >使用#和%语法糖的矢量函数。

由于

4 个答案:

答案 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 [...] ...)