在clojure

时间:2016-02-27 23:44:00

标签: function clojure

我开始学习clojure。在我的书中有以下练习:

  

编写一个函数mapset,它的工作方式与map类似,但返回值为set:

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

我从这样的事情开始:

(defn mapset
  [vect]
  (set vect))

结果是错误

  

"错误的args(2)传递给:core / mapset"

我也试过[& args]

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

2 个答案:

答案 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])

由于代码是数据,因此“调用”只是三个元素的列表:

  1. 符号mapset
  2. 符号inc
  3. 向量[1 1 2 2]
  4. 当您评估此代码时,Clojure将看到它是一个列表并继续评估该列表中的每个项目(一旦确定它不是特殊形式或宏),那么它将具有新的三个要素清单:

    1. 符号core/mapset被绑定的函数
    2. 符号clojure.core/inc被绑定的函数
    3. 向量[1 1 2 2]
    4. 最后,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} }}