Jos*_*ver 1 functional-programming clojure
我在2D空间中有一个点矢量,例如:
[[0 0] [1 1] [2 2]]
Run Code Online (Sandbox Code Playgroud)
并且需要计算某个点与向量中每个点之间的距离,以确定向量中的哪个点最接近我正在查询的点.我需要知道距离和最近点,所以我想要一个像这样的哈希矢量:
[{:point [0 0] :dist 2.7} {:point [1 1] :dist 3.5} {:point [2 2] :dist 4.3}]
Run Code Online (Sandbox Code Playgroud)
我如何将前者转变为后者?我试过这样的事情:
(defn closest-point [point all-points]
(map #({:point % :dist (distance point %)}) all-points))
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
(user=> ArityException Wrong number of args (0) passed to: PersistentArrayMap clojure.lang.AFn.throwArity (AFn.java:437)
Run Code Online (Sandbox Code Playgroud)
#({...})
扩展到(fn [] ({....}))
试图调用地图而没有任何参数.
试试这个:
(defn closest-point [point all-points]
(map (fn [p] {:point p :dist (distance point p)}) all-points))
Run Code Online (Sandbox Code Playgroud)
要么
(defn closest-point [point all-points]
(map #(hash-map :point % :dist (distance point %)) all-points))
Run Code Online (Sandbox Code Playgroud)
要么
(defn dist-info
[point p]
{:point p :dist (distance point p)})
(defn closest-point [point all-points]
(map #(dist-info point %) all-points))
Run Code Online (Sandbox Code Playgroud)
如果你使用for
理解而不是a,这更具可读性map
.另外,要实际选择最近的点,您可以使用min-key
:
(defn closest-point [point all-points]
(apply min-key :dist
(for [p all-points]
{:point p :dist (distance point p)})))
Run Code Online (Sandbox Code Playgroud)