Clojure:列表和返回列表的函数之间的区别
我是个新手。我试图理解为什么第二种形式不起作用: 第一种形式:Clojure:列表和返回列表的函数之间的区别,clojure,Clojure,我是个新手。我试图理解为什么第二种形式不起作用: 第一种形式: user=>(def nums(range 3)) (0 1 2) user=>(map #(list %1) nums) ((0) (1) (2)) 第二种形式: user=> (map #(list %1) (0 1 2)) java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn (NO_SOURC
user=>(def nums(range 3))
(0 1 2)
user=>(map #(list %1) nums)
((0) (1) (2))
第二种形式:
user=> (map #(list %1) (0 1 2))
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn
(NO_SOURCE_FILE:0)
问题在于表达式
(0 1 2)
,它被解释为0
,应用于1
和2
;这是不可能的,因为0
不是一个函数
(map #(list %1) '(0 1 2))
(map #(list %) [0 1 2])
但是可以按预期工作。因为(0 1 2)
表示使用args 1和args 2调用函数0,但0不是函数。因此,您需要使用quote或list函数创建一个列表,而不是函数应用程序,即'(0 1 2)
或者
(列表0 1 2)
拉斯曼和安克尔拥有它。我意识到这是一个微不足道的例子,但使用向量而不是列表可能更为惯用:
(map #(list %1) [0 1 2])
当只有一个参数传递给匿名函数时,也可以使用%
而不是%1
(map #(list %1) '(0 1 2))
(map #(list %) [0 1 2])
是的,我在提交问题后意识到,但由于堆栈溢出限制,我无法回答自己。谢谢你。事实上,你可以回答你自己关于Stackoverflow的问题。也许他的排名太低了或者什么的?