2011-12-07 151 views
4

我是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_SOURCE_FILE:0) 

回答

11

的问题是表达(0 1 2),这被解释为0适用于12;那是不可能的,因为0不是一个函数。

(map #(list %1) '(0 1 2)) 

虽然按预期工作。

5

因为(0 1 2)意味着调用带有参数1和2的函数0,但0不是函数。所以你需要制作一个列表而不是功能应用程序,使用报价或列表功能,例如'(0 1 2)(list 0 1 2)

+0

是的,我在提交问题后实现,但couldn回答,因为StackOverflow上的限制自己。谢谢。 –

+0

其实,你可以在Stackoverflow上回答你自己的问题。 – Cubic

+1

也许他的排名太低或什么的? – sjas

4

larsmans和Ankur有它。我意识到这是一个简单的例子,但它可能会更习惯使用的载体,而不是一个列表:

(map #(list %1) [0 1 2]) 

您还可以使用%而不是%1如果只有一个传递到匿名函数ARG。

(map #(list %) [0 1 2]) 
1
user=> (map list (range 3)) 
((0) (1) (2)) 
user=> (map list '(0 1 2)) 
((0) (1) (2)) 
user=> (map list [0 1 2]) 
((0) (1) (2)) 
相关问题