【问题标题】:How I can apply map in this code? (Clojure)如何在此代码中应用地图? (Clojure)
【发布时间】:2016-12-16 20:54:04
【问题描述】:

我开始学习 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 和 data-record 函数。 在这种情况下:

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"}

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

【问题讨论】:

    标签: clojure


    【解决方案1】:

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

    一种方式:

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

    这里的关键要点是:

    • 解构输入以继续并将标头与数据分开
    • 使用核心 keyword 函数构建标头一次
    • 编写一个始终采用同一组标头的函数,然后将该函数映射到我们的数据上
    • 请注意,没有外部函数,当我们可以摆脱它时,这总是一件好事

    现在,为了让您的方式工作,您需要做的是在 x 上映射 data-record 函数。首先,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)))
    

    【讨论】:

    • 谢谢,乔希。我理解我的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多