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

coc*_*oco 12 clojure type-conversion

我正在学习Clojure而且我有一个疑问:

为什么当我打字

(map vector '("1" "2" "3"))
Run Code Online (Sandbox Code Playgroud)

我明白了 (["1"] ["2"] ["3"])

没关系,因为它vector是一个功能(或者几乎我认为),我可以做到 (vector "3")并且得到["3"].

到目前为止这么好,但是当我尝试的时候

(map Integer/parseInt '("1" "2" "3"))
Run Code Online (Sandbox Code Playgroud)

我收到一个错误.不应该parseInt表现得像一个功能?

然后我需要打字

(map #(Integer/parseInt %) '(......
Run Code Online (Sandbox Code Playgroud)

为什么我不能parseInt像功能一样使用?对我来说这是一个功能,我可以像使用它一样

(Integer/parseInt "3")
Run Code Online (Sandbox Code Playgroud)

我觉得它有点不连贯,但我确定我犯了一些错误,为此,我问它......

nic*_*kik 16

你必须把它包起来#()(fn ...).这是因为Integer/parseInt是一种Java方法,并且Java方法无法传递.他们没有实现IFn接口.

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


mik*_*era 5

正如其他人所说,您需要包装 Integer/parseInt 以便将其从 Java 方法转换为 Clojure 函数:

(map #(Integer/parseInt %) '("1" "2" "3"))
Run Code Online (Sandbox Code Playgroud)

这样做的原因是 Clojure 函数必须实现 IFn 接口才能作为参数传递到更高阶函数,例如map.

如果您多次进行这种转换,这有点难看,因此我建议按如下方式包装您的 parse-int 函数:

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

(map parse-int '("1" "2" "3"))
Run Code Online (Sandbox Code Playgroud)

作为最后的选择,您可能希望使用内置的 read-string 函数 - 这将在您的情况下返回整数,但也适用于双打等:

(map read-string '("1" "2" "3"))
Run Code Online (Sandbox Code Playgroud)