2011-06-01 104 views
11

我学习Clojure地图parseInt函数和我有一个疑问:奇怪的错误时,试图用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

[转换串序列为整数(Clojure的)可能重复(HTTP ://stackoverflow.com/questions/4714923/convert-a-sequence-of-strings-to-integers-clojure) – amalloy 2011-06-01 06:29:44

回答

16

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

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

+0

非常感谢..现在很清楚:D – coco 2011-06-01 13:41:18

4

正如其他人所指出的,你需要用整数/ parseInt函数,以便将其从一个Java方法转换为Clojure的功能:

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

这样做的原因是,Clojure的功能必须实现IFN接口以便作为参数传递给更高阶的函数,如map

这是一个有点难看,如果你正在做这样的转换很多次,所以我建议你包裹解析-INT功能如下:

​​

作为最后的选择,你可能希望使用内置的读字符串函数 - 这将返回整数你的情况,但也将工作双打等:

(map read-string '("1" "2" "3")) 
+0

非常感谢..现在很清楚:D – coco 2011-06-01 13:42:22