我开始学习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"}
如何使用地图获得正确的结果?
答案 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 zipmap
和table-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)))