2016-02-27 57 views
1

我已经开始学习clojure了。在我的书有以下练习:clojure简单功能的错误

写一个函数,地图集,该作品一样,除了返回值地图是一组:

(mapset inc [1 1 2 2]) 
; => #{2 3} 

我已经开始像这样的东西:

(defn mapset 
    [vect] 
    (set vect)) 

结果是错误

“数ARGS的错误的(2)传递到:核/地图集”

我试图[& args]为好。

所以,问题是:我该如何解决这样的问题?

回答

3

看看你的电话细看到mapset

(mapset inc [1 1 2 2]) 

由于代码数据,这个 “呼叫” 仅仅是一个三个要素的列表:

  1. 符号mapset
  2. 符号inc
  3. 载体[1 1 2 2]

当你评估这段代码时,Clojure会看到它是一个列表并着手评估e在该列表中的项目的ACH(一旦它确定它不是一个特殊形式或宏),所以那么它将具有三个元素的一个新的列表:

  1. 到其中符号core/mapset是结合的功能
  2. 该函数其中符号clojure.core/inc被绑定
  3. 载体[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]

+0

该死的。当你第一次处理它时,这些东西真的会打破你的头脑。出于某种原因,我正在考虑'map'和这个'mapset'就像一个数据结构,而不是每个人的map函数。这样的耻辱:)无论如何,谢谢你的详细解答 –

4

你的mapset定义只有一个参数vect

最起码你需要采取两个参数,一个函数和一个序列

(defn mapset [f xs] (set (map f xs)))` 

但想想这是构成有趣的是, 2个功能也:

(def mapset (comp set map))