尝试在Clojure中映射parseInt时出现奇怪的错误

尝试在Clojure中映射parseInt时出现奇怪的错误,clojure,type-conversion,Clojure,Type Conversion,我正在学习,我有一个疑问: 为什么我打字 (map vector '("1" "2" "3")) 我得到([“1”][“2”][“3”]) 这没关系,因为向量是一个函数(或者我几乎认为是),我可以做到 (向量“3”)并获取[“3”] 到目前为止还不错,但当我尝试 (map Integer/parseInt '("1" "2" "3")) 我犯了一个错误。parseInt不应该像函数一样工作吗 然后我需要打字 (map #(Integer/parseInt %) '(...... 为什么我不

我正在学习,我有一个疑问:

为什么我打字

(map vector '("1" "2" "3"))
我得到
([“1”][“2”][“3”])

这没关系,因为
向量
是一个函数(或者我几乎认为是),我可以做到
(向量“3”)
并获取
[“3”]

到目前为止还不错,但当我尝试

(map Integer/parseInt '("1" "2" "3"))
我犯了一个错误。
parseInt
不应该像函数一样工作吗

然后我需要打字

(map #(Integer/parseInt %) '(......
为什么我不能像函数一样使用
parseInt
?对我来说,这是一个函数,我可以像

(Integer/parseInt "3")

我觉得有点语无伦次,但我肯定我犯了一些错误,正是为了这个,我问它…

看看StackOverflow问题。答案是:您必须在匿名函数中包装Integer/parseInt,因为Java方法不是函数。

您必须在
#()
(fn…
中包装它。这是因为Integer/parseInt是一个Java方法,不能传递Java方法。他们没有实现IFn的
接口


Clojure是基于Java构建的,有时会泄漏,这就是其中一种情况。

正如其他人所述,您需要包装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,读取字符串的可能重复项就可以工作。如果是,它将尝试解释为八进制字符串,这可能不是您想要的。