Я строю функцию для размещения строк внутри векторов.Clojure Anonymous Функции
Я не могу понять, хотя, почему эта работа:
(mapv (fn [i] [i]) '("hi" "there"))
, но это не работает:
(mapv #([%]) '("hi" "there"))
Я строю функцию для размещения строк внутри векторов.Clojure Anonymous Функции
Я не могу понять, хотя, почему эта работа:
(mapv (fn [i] [i]) '("hi" "there"))
, но это не работает:
(mapv #([%]) '("hi" "there"))
См: https://clojuredocs.org/clojure.core/fn#example-560054c2e4b08e404b6c1c80
В короткий: #(f) == (fn [] (f))
, поэтому #([1 2 3]) == (fn [] ([1 2 3]))
Надеюсь, это поможет.
#()
ожидает, что функция станет первым аргументом. Вы могли бы сделать #(vector %)
например:
(map #(vector %) (range 5))
> ([0] [1] [2] [3] [4])
Конечно, вы можете просто сделать:
(map vector (range 5))
> ([0] [1] [2] [3] [4])
As glts mentioned, анонимную функцию reader macro оборачивает свое тело в списке, например:
(read-string "#([%])")
;=> (fn* [p1__20620#] ([p1__20620#]))
Обычно для ситуаций, когда y НУ нужно написать анонимную функцию, чье тело является вектором, я бы рекомендовал просто используя fn
макрос, как вы сделали в вашем вопросе:
(mapv (fn [i] [i]) '("hi" "there"))
;=> [["hi"] ["there"]]
В этом случае, однако, ваш (fn [i] [i])
эквивалентно встроенные функции vector
, поэтому я предлагаю вам использовать это вместо того, чтобы:
(mapv vector '("hi" "there"))
;=> [["hi"] ["there"]]
Ответил [здесь] (http://stackoverflow.com/q/13204993) и [здесь] (HTTP: // StackOverflow. ком/кв/4921566). – glts