我如何解释在 clojure 中采用 fn 的 merge-with?
How do I interpret merge-with that takes a fn in clojure?
我目前正在学习 Clojure,我完全是个初学者,如果能帮助我理解,我将不胜感激。我今天浏览了一些代码并找到了这个。
(let [timepoints (merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum )])
其中 mf, swt, timepoint-max and timepoint-sum
看起来像
{"Timepoint1": 3, "Timepoint2": 2}
那么上面的代码是做什么的?
我知道我们将变量 timepoints
设置为两个映射之间的某种联合(?)。但我对 fn [mf swt] [mf swt]
部分特别困惑。
表达式 (fn [mf swt] [mf swt])
是一个匿名 clojure 函数,它根据传递给它的两个参数构造一个向量,例如
((fn [mf swt] [mf swt]) :a :b)
;; => [:a :b]
表达式 (merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum )
是对函数 merge-with 的调用,第一个参数 (fn [mf swt] [mf swt])
、第二个参数 timepoint-max
和第三个参数 timepoint-sum
。这是我们将 timepoint-max
和 timepoint-sum
绑定到一些示例值的示例:
(def timepoint-max {:x 0 :y 1})
(def timepoint-sum {:y 100 :z 200})
(merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum)
;; => {:x 0, :y [1 100], :z 200}
阅读 merge-with 的文档以了解它的作用:
Returns a map that consists of the rest of the maps conj-ed onto the
first. If a key occurs in more than one map, the mapping(s) from the
latter (left-to-right) will be combined with the mapping in the result
by calling (f val-in-result val-in-latter).
在上面的例子中,我们实际计算的是一样的
{:x (:x timepoint-max)
:y ((fn [mf swt] [mf swt]) (:y timepoint-max) (:y timepoint-sum))
:z (:z timepoint-sum)}
;; => {:x 0, :y [1 100], :z 200}
其中函数 (fn [mf swt] [mf swt])
用于在唯一重叠的键 :y
处组合两个值。
完整的表达式 (let [timepoints (merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum )])
是一种 let 形式,它将值绑定到符号,但它不是很有用,因为它的 *exprs
部分是空的,所以它总是计算为 nil
:
(let [timepoints (merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum )])
;; => nil
为了让它评估其他东西,例如timepoints
,它必须被修改成类似
的东西
(let [timepoints (merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum) ]
timepoints)
;; => {:x 0, :y [1 100], :z 200}
我目前正在学习 Clojure,我完全是个初学者,如果能帮助我理解,我将不胜感激。我今天浏览了一些代码并找到了这个。
(let [timepoints (merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum )])
其中 mf, swt, timepoint-max and timepoint-sum
看起来像
{"Timepoint1": 3, "Timepoint2": 2}
那么上面的代码是做什么的?
我知道我们将变量 timepoints
设置为两个映射之间的某种联合(?)。但我对 fn [mf swt] [mf swt]
部分特别困惑。
表达式 (fn [mf swt] [mf swt])
是一个匿名 clojure 函数,它根据传递给它的两个参数构造一个向量,例如
((fn [mf swt] [mf swt]) :a :b)
;; => [:a :b]
表达式 (merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum )
是对函数 merge-with 的调用,第一个参数 (fn [mf swt] [mf swt])
、第二个参数 timepoint-max
和第三个参数 timepoint-sum
。这是我们将 timepoint-max
和 timepoint-sum
绑定到一些示例值的示例:
(def timepoint-max {:x 0 :y 1})
(def timepoint-sum {:y 100 :z 200})
(merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum)
;; => {:x 0, :y [1 100], :z 200}
阅读 merge-with 的文档以了解它的作用:
Returns a map that consists of the rest of the maps conj-ed onto the first. If a key occurs in more than one map, the mapping(s) from the latter (left-to-right) will be combined with the mapping in the result by calling (f val-in-result val-in-latter).
在上面的例子中,我们实际计算的是一样的
{:x (:x timepoint-max)
:y ((fn [mf swt] [mf swt]) (:y timepoint-max) (:y timepoint-sum))
:z (:z timepoint-sum)}
;; => {:x 0, :y [1 100], :z 200}
其中函数 (fn [mf swt] [mf swt])
用于在唯一重叠的键 :y
处组合两个值。
完整的表达式 (let [timepoints (merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum )])
是一种 let 形式,它将值绑定到符号,但它不是很有用,因为它的 *exprs
部分是空的,所以它总是计算为 nil
:
(let [timepoints (merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum )])
;; => nil
为了让它评估其他东西,例如timepoints
,它必须被修改成类似
(let [timepoints (merge-with (fn [mf swt] [mf swt]) timepoint-max timepoint-sum) ]
timepoints)
;; => {:x 0, :y [1 100], :z 200}