我如何解释在 clojure 中需要 fn 的合并?



我目前正在学习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 )是对函数合并的调用,第一个参数(fn [mf swt] [mf swt])、第二个参数timepoint-max和第三个参数timepoint-sum。下面是我们将timepoint-maxtimepoint-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 的文档以了解它的作用:

返回一个映射,该映射由其余映射组成 第一。 如果一个键出现在多个映射中,则来自 后者(从左到右)将与结果中的映射相结合 通过调用(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}

最新更新