我正在学习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")
我觉得它有点不连贯,但我确定我犯了一些错误,为此我问它......
答案 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方法不是函数。