我如何在这段代码中应用地图? (Clojure的)

时间:2016-12-16 20:54:05

标签: clojure

我开始学习Clojure并需要任务帮助。

我必须写这个函数:

(data-table student-tbl)
;; => ({:surname "Ivanov", :year "1996", :id "1"}
;;     {:surname "Petrov", :year "1996", :id "2"}
;;     {:surname "Sidorov", :year "1997", :id "3"})

我必须使用let,map,next,table-keys和数据记录功能。 在这种情况下:

student-tbl => (["id" "surname" "year" "group_id"] ["1" "Ivanov" "1998"] ["2" "Petrov" "1997"] ["3" "Sidorov" "1996"])
(table-keys student-tbl) => [:id :surname :year :group_id]
(data-record [:id :surname :year :group_id] ["1" "Ivanov" "1996"]) => {:surname "Ivanov", :year "1996", :id "1"}

我写了这个:

(defn data-table [tbl]
  (let [[x] (next tbl)]
    (data-record (table-keys tbl) x)
  ))

(data-table student-tbl) => {:surname "Ivanov", :year "1998", :id "1"}

如何使用地图获得正确的结果?

1 个答案:

答案 0 :(得分:1)

首先,您应该在实践中如何写这个。然后我会告诉你你的错误,这样你就可以学习你的作业。

一种方式:

(defn data-table
  [[headers & data]]
  (let [headers (map keyword headers)
        data-record (partial zipmap headers)]
    (map data-record data)))

这里的关键要点是:

  • 将输入结构化以继续并将标题与数据分开
  • 使用核心keyword函数
  • 构建一次标头
  • 撰写一个总是采用相同标题集的函数,然后将该函数映射到我们的数据
  • 请注意,没有外部功能,当我们可以逃脱时,这总是一件好事

现在,为了让您的方式有效,您需要做的是将data-record函数映射到x。首先,let绑定应该(next tbl)绑定到x,而不是[x](你的方式,你只获得数据集的第一个元素(Ivanov) ,1998年,1)。

在此示例中,忽略let中的data-record zipmaptable-keys绑定。他们在那里使这个例子有效,你可以安全地删除它们。

(defn data-table-newb
  [tbl]
  (let [table-keys #(map keyword (first %))
        headers (table-keys tbl)
        data-record zipmap
        x (next tbl)]
    (map #(data-record headers %) x)))

基本上,您在开始时计算表头,然后创建一个新的匿名函数,该函数调用data-record并为其提供计算的标题和单独的数据向量。您将该函数应用于数据列表的每个元素,并绑定到x

删除其他地方定义的不必要的函数,你得到:

(defn data-table-newb
  [tbl]
  (let [headers (table-keys tbl)
        x (next tbl)]
    (map #(data-record headers %) x)))