我已经开始学习clojure了。在我的书有以下练习:clojure简单功能的错误
写一个函数,地图集,该作品一样,除了返回值地图是一组:
(mapset inc [1 1 2 2])
; => #{2 3}
我已经开始像这样的东西:
(defn mapset
[vect]
(set vect))
结果是错误
“数ARGS的错误的(2)传递到:核/地图集”
我试图[& args]
为好。
所以,问题是:我该如何解决这样的问题?
我已经开始学习clojure了。在我的书有以下练习:clojure简单功能的错误
写一个函数,地图集,该作品一样,除了返回值地图是一组:
(mapset inc [1 1 2 2])
; => #{2 3}
我已经开始像这样的东西:
(defn mapset
[vect]
(set vect))
结果是错误
“数ARGS的错误的(2)传递到:核/地图集”
我试图[& args]
为好。
所以,问题是:我该如何解决这样的问题?
看看你的电话细看到mapset
:
(mapset inc [1 1 2 2])
由于代码数据,这个 “呼叫” 仅仅是一个三个要素的列表:
mapset
inc
[1 1 2 2]
当你评估这段代码时,Clojure会看到它是一个列表并着手评估e在该列表中的项目的ACH(一旦它确定它不是一个特殊形式或宏),所以那么它将具有三个元素的一个新的列表:
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 1 2 2]
。
你的mapset
定义只有一个参数vect
最起码你需要采取两个参数,一个函数和一个序列
(defn mapset [f xs] (set (map f xs)))`
但想想这是构成有趣的是, 2个功能也:
(def mapset (comp set map))
该死的。当你第一次处理它时,这些东西真的会打破你的头脑。出于某种原因,我正在考虑'map'和这个'mapset'就像一个数据结构,而不是每个人的map函数。这样的耻辱:)无论如何,谢谢你的详细解答 –