2011-12-07 78 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)) 
相關問題