Clojure: 列表和返回列表的函数之间的区别

4
我是一名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)
4个回答

11

问题出在表达式(0 1 2),它被解释为对12应用0;这是不可能的,因为0不是一个函数。

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

尽管如此,它仍按预期工作。


5

因为 (0 1 2) 表示调用函数0并传递参数1和2,但0不是一个函数。所以你需要将其变成列表而不是函数应用,使用引号或列表函数即 '(0 1 2) 或者 (list 0 1 2)


是的,我在提交问题后意识到了这一点,但由于StackOverflow的限制,我无法回答自己。谢谢。 - Eduardo Yáñez Parareda
实际上,你可以在Stackoverflow上回答自己的问题。 - Cubic
1
也许他的等级太低了或者其他什么原因? - sjas

4

larsmans和Ankur有它。我意识到这只是一个琐碎的例子,但使用向量而不是列表可能更符合习惯:

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

当只传递一个参数到匿名函数时,您也可以使用%代替%1

(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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接