如何解决尝试在Clojure中映射parseInt时发生奇怪的错误
|| 我正在学习Clojure,并且对此表示怀疑: 为什么输入(map vector \'(\"1\" \"2\" \"3\"))
我get1
可以,因为vector
是一个函数(或者几乎我认为是),并且我可以
(vector \"3\")
,得到[\"3\"]
。
到目前为止很好,但是当我尝试
(map Integer/parseInt \'(\"1\" \"2\" \"3\"))
我得到一个错误。 parseInt
不应表现为函数吗?
那我需要输入
(map #(Integer/parseInt %) \'(......
为什么不能将function6用作函数?对我来说这是一个功能,我可以像这样使用它
(Integer/parseInt \"3\")
我觉得它有点不连贯,但是我确定我在犯一些错误,为此,我要问...
解决方法
您必须将其包裹在
#()
或(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\"))
作为最后的选择,您可能想使用内置的read-string函数-这将返回您的情况下的整数,但也可以用于double等。
(map read-string \'(\"1\" \"2\" \"3\"))
, 看看堆栈溢出问题将字符串序列转换为整数(Clojure)。答案是:您必须将Integer / parseInt包装在匿名函数中,因为Java方法不是函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。