Странная ошибка при попытке отобразить parseInt в Clojure - PullRequest
11 голосов
/ 01 июня 2011

Я учусь Clojure и у меня есть сомнения:

Почему, когда я печатаю

(map vector '("1" "2" "3"))

, я получаю (["1"] ["2"] ["3"])

Это нормально, потому что vector - это функция (или почти я так думаю), и я могу сделать (vector "3") и получить ["3"].

Пока все хорошо, но когда я пытаюсь

(map Integer/parseInt '("1" "2" "3"))

Я получаю ошибку.Разве parseInt не должен вести себя как функция?

Тогда мне нужно набрать

(map #(Integer/parseInt %) '(......

Почему я не могу использовать parseInt как функцию?Для меня это функция, и я могу использовать ее как

(Integer/parseInt "3")

Я чувствую, что это немного бессвязно, но я уверен, что делаю какую-то ошибку, и для этого я ее спрашиваю ...

Ответы [ 3 ]

16 голосов
/ 01 июня 2011

Вы должны обернуть его в #() или (fn ...). Это потому, что Integer / parseInt является методом Java и методы Java не могут быть переданы. Они не реализуют интерфейс IFn.

Clojure построен на Java, и иногда он просачивается, и это один из таких случаев.

4 голосов
/ 01 июня 2011

Как уже говорили другие, вам нужно обернуть Integer / parseInt, чтобы преобразовать его из метода Java в функцию Clojure:

(map #(Integer/parseInt %) '("1" "2" "3"))

Причина этого заключается в том, что функции Clojure должны реализовывать интерфейс IFn для передачи в качестве аргументов в функции более высокого порядка, такие как map.

Это немного уродливо, если вы делаете такое преобразование много раз, поэтому я бы порекомендовал обернуть вашу функцию parse-int следующим образом:

(defn parse-int [s] (Integer/parseInt s))

(map parse-int '("1" "2" "3"))

В качестве окончательной альтернативы, вы можете использовать встроенную функцию чтения строки - она ​​будет возвращать целые числа в вашем случае, но также будет работать для двойных чисел и т. Д.

(map read-string '("1" "2" "3"))
0 голосов
/ 01 июня 2011

Взгляните на вопрос переполнения стека Преобразование последовательности строк в целые числа (Clojure) .Ответ гласит: Вы должны обернуть Integer / parseInt в анонимную функцию, потому что методы Java не являются функциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...