我正在尝试将包含节点列表的一些向量传递给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等等?
感谢。
答案 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。
您可以考虑将其作为移动括号(函数调用)应用于他的第一个参数,并从最后一个参数中取出括号(如果有的话)。