我开始学习clojure。在我的书中有以下练习:
编写一个函数mapset,它的工作方式与map类似,但返回值为set:
(mapset inc [1 1 2 2])
; => #{2 3}
我从这样的事情开始:
(defn mapset
[vect]
(set vect))
结果是错误
"错误的args(2)传递给:core / mapset"
我也试过[& args]
。
所以,问题是:我该如何解决这个问题?
答案 0 :(得分:4)
您对>>> x = my_dict.pop(1)
>>> x
'aaaa'
>>> my_dict
{3: 'ccc'}
的定义只需一个参数mapset
至少你需要拿2个参数,一个函数和一个序列
vect
但考虑到这两个功能的组成也很有趣:
(defn mapset [f xs] (set (map f xs)))`
答案 1 :(得分:3)
仔细查看您对mapset
的电话:
(mapset inc [1 1 2 2])
由于代码是数据,因此“调用”只是三个元素的列表:
mapset
inc
[1 1 2 2]
当您评估此代码时,Clojure将看到它是一个列表并继续评估该列表中的每个项目(一旦确定它不是特殊形式或宏),那么它将具有新的三个要素清单:
core/mapset
被绑定的函数clojure.core/inc
被绑定的函数[1 1 2 2]
最后,Clojure将调用列表的第一个元素,其余元素作为参数。在这种情况下,列表的其余部分中有两个参数,但在您的函数定义中,您只考虑了一个:
(defn mapset
[vect]
(set vect))
要解决此问题,您可以按如下方式实施mapset
:
(defn mapset
[f vect]
(set (map f vect)))
现在,当您调用(mapset inc [1 1 2 2])
时,将在函数f
中找到参数clojure.core/inc
,并且参数vect
将绑定到向量{{1} }}