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

时间:2011-06-01 05:34:18

标签: clojure type-conversion

我正在学习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 个答案:

答案 0 :(得分:16)

您必须将其打包在#()(fn ...)中。这是因为Integer / parseInt是一种Java方法,并且Java方法无法传递。它们没有实现IFn接口。

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

答案 1 :(得分:4)

正如其他人所说,你需要包装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"))

答案 2 :(得分:0)

查看Stack Overflow问题 Convert a sequence of strings to integers (Clojure) 。答案是:你必须在一个匿名函数中包装Integer / parseInt,因为Java方法不是函数。