Clojure将单个变量传递给函数

时间:2016-04-02 00:34:33

标签: clojure functional-programming apply

我正在尝试将包含节点列表的一些向量传递给clojure中的函数,如果我要键入变量,则该函数可以工作但我不确定如何从每个向量中传递单个变量

(def ItemPickUp [:a1 :Mail])
(def ItemDestinations [:Storage :a1])
(def Robot {[ItemPickUp] [ItemDestinations]})



(defn shortestPath [g start dest]
(let [not-destination? (fn [[vertex _]] (not= vertex dest))]
(-> (shortest-paths g start)
    (->> (drop-while not-destination?))
    first
    (nth 2))))

(apply shortestPath G (apply first Robot)((apply second Robot)))

我需要使用机器人将ItemPickUp和ItemDestination中的变量传递给shortestPath,但不是传递其中的一个变量,而是传递两个:a1和:Mail,反之亦然。

我如何单独传递每个变量,因此第一次迭代的前两个变量是:a1和:Storage等等?

感谢。

2 个答案:

答案 0 :(得分:1)

在Clojure中,通常使用map - it takes a function f and any number of collections and lazily produces a sequence of (f (first coll1) (first coll2)...), (f (second coll1) (second coll2)...)...来完成 所以它应该只是

(map (partial shortestPath G) ItemPickup ItemDestinations)

(其他一些函数语言区分一个集合map ping和多集合zip ping - 我相信Haskell在这里很有影响力。它需要这个,因为它的函数有固定的arities,所以你有{ {1}},zipWith等。有了表示参数数量的表示意味着Lisps不必处理它。)

答案 1 :(得分:0)

如果是(def Robot [[ItemPickUp] [ItemDestinations]])并且你想使用它,你可以这样做:

(apply map (partial shortestPath G) Robot)

在这种情况下申请将减少到:

(map (partial shortestPath G) (first Robot) (second Robot))

当然,如果Robot有两个以外的元素,它将抛出ArityException。

您可以考虑将其作为移动括号(函数调用)应用于他的第一个参数,并从最后一个参数中取出括号(如果有的话)。