Отобразить вектор векторов на вектор хешей в Clojure - PullRequest
1 голос
/ 12 декабря 2011

У меня есть вектор точек в 2D-пространстве, например:

[[0 0] [1 1] [2 2]]

И нужно вычислить расстояние между некоторой точкой и каждой точкой в ​​векторе, чтобы определить, какая точка в векторе является ближайшей к точке, которую я запрашиваю. Мне нужно знать и расстояние, и ближайшую точку, поэтому я хочу, чтобы вектор хэшей был таким:

[{:point [0 0] :dist 2.7} {:point [1 1] :dist 3.5} {:point [2 2] :dist 4.3}]

Как я могу превратить первое во второе? Я пробовал что-то вроде этого:

(defn closest-point [point all-points]
    (map #({:point % :dist (distance point %)}) all-points))

Но я получаю ошибку:

(user=> ArityException Wrong number of args (0) passed to: PersistentArrayMap  clojure.lang.AFn.throwArity (AFn.java:437)

Ответы [ 4 ]

9 голосов
/ 12 декабря 2011

#({...}) расширяется до (fn [] ({....})), который пытается вызвать карту без каких-либо аргументов.

Попробуйте это:

(defn closest-point [point all-points]
    (map (fn [p] {:point p :dist (distance point p)}) all-points))

или

(defn closest-point [point all-points]
    (map #(hash-map :point % :dist (distance point %)) all-points))

или

(defn dist-info
  [point p]
  {:point p :dist (distance point p)})

(defn closest-point [point all-points]
    (map #(dist-info point %) all-points))
5 голосов
/ 12 декабря 2011

Это более читабельно, если вы используете for понимание вместо map. Кроме того, чтобы фактически выбрать ближайшую точку, вы можете просто использовать min-key:

(defn closest-point [point all-points]
  (apply min-key :dist
         (for [p all-points]
           {:point p :dist (distance point p)})))
2 голосов
/ 12 декабря 2011

Как насчет того, чтобы исправить это, не удаляя ничего из вашего кода и просто добавляя одно слово: identity

(defn closest-point [point all-points]
    (map #(identity {:point % :dist (distance point %)}) all-points))
1 голос
/ 12 декабря 2011
(defn closest-point [point all-points]
  (map #(hash-map :point % :dist (distance point %) ) all-points)                                                                 

Результат: -

({:point [0 0], :dist 2.7} {:point [1 1], :dist 3.5} {:point [2 2], :dist 4})
...