Clojure:带有reduce的匿名函数
我是clojure的新手,在clojure文档中注意到了这个例子Clojure:带有reduce的匿名函数,clojure,Clojure,我是clojure的新手,在clojure文档中注意到了这个例子 (reduce(fn[m[k v]](assoc m v k)){{}{:b2:a1:c3}) 输出:;=>{2:b,1:a,3:c} 有人能解释代码背后的逻辑吗?第一个映射为空,是一个可选的初始化值,它是传递给reduce函数的第一个参数。第二个映射是要减少其项的集合。在这种情况下,每个项目都是一个映射条目,它们作为第二个参数一次传递给缩减函数一个 假设您的输入映射有三个键/值对,那么reduce函数将被调用三次。缩减函数的m参
(reduce(fn[m[k v]](assoc m v k)){{}{:b2:a1:c3})
输出:;=>{2:b,1:a,3:c}
有人能解释代码背后的逻辑吗?第一个映射为空,是一个可选的初始化值,它是传递给reduce函数的第一个参数。第二个映射是要减少其项的集合。在这种情况下,每个项目都是一个
映射条目
,它们作为第二个参数一次传递给缩减函数一个
假设您的输入映射有三个键/值对,那么reduce函数将被调用三次。缩减函数的m
参数是指第一次调用时的初始化值(空映射),分解后的第二个参数k和v
来自迭代中传递的MapEntry
对
虽然在大多数情况下,reduce函数在对第一个参数进行操作后返回第一个参数,但在您的示例中,它会反转第二个参数的键/值,并将新的对与初始化值关联,但并不严格要求这样做。第一个映射为空,是一个可选的初始化值,它是传递给reduce函数的第一个参数。第二个映射是要减少其项的集合。在这种情况下,每个项目都是一个
映射条目
,它们作为第二个参数一次传递给缩减函数一个
假设您的输入映射有三个键/值对,那么reduce函数将被调用三次。缩减函数的m
参数是指第一次调用时的初始化值(空映射),分解后的第二个参数k和v
来自迭代中传递的MapEntry
对
虽然在大多数情况下,reduce函数在对第一个参数进行操作后返回第一个参数,但在您的示例中,它会反转第二个参数的键/值,并将新的对与初始化值关联,不严格要求这样做。
reduce
将函数应用于累加器和序列中的每个元素,生成最终结果。ClojureDocs以(reduce f coll)
或(reduce f val coll)
的形式给出。您的示例具有后一个签名,元素匹配如下:
:应用于每个条目的函数,f
(fn[m[k v]]…
:初始累加器,val
{}
:要操作的集合,coll
{:b2:a1:c3}
(fn[m[k v]](assoc m v k))
。第一个参数m
是累加器的当前值,它是{}
在reduce.的开头,用于第二个参数,即要处理的当前值,即映射项。映射项被分解为其键k
和值v
。匿名函数体只需将一个新的“反向”项放入累加器(即map),因此原始序列v
的值是键,键k
成为值。结果类似于应用Clojure API函数
请注意,有一个单独的函数用于减少关联集合(例如地图)。reduce kv
“为您进行分解”。这允许将匿名函数编写为:
(fn [m k v] (assoc m v k))
或者更简单地用简短的符号:
#(assoc %1 %3 %2)
reduce
将一个函数应用于累加器和序列中的每个元素,生成最终结果。ClojureDocs给出(reduce f coll)
或(reduce f val coll)
。您的示例具有后一个签名,其中元素匹配如下:
:应用于每个条目的函数,f
(fn[m[k v]]…
:初始累加器,val
{}
:要操作的集合,coll
{:b2:a1:c3}
(fn[m[k v]](assoc m v k))
。第一个参数m
是累加器的当前值,它是{}
在reduce.的开头,用于第二个参数,即要处理的当前值,即映射项。映射项被分解为其键k
和值v
。匿名函数体只需将一个新的“反向”项放入累加器(即map),因此原始序列v
的值是键,键k
成为值。结果类似于应用Clojure API函数
请注意,有一个单独的函数用于减少关联集合(例如地图)。reduce kv
“为您进行分解”。这允许将匿名函数编写为:
(fn [m k v] (assoc m v k))
或者更简单地用简短的符号:
#(assoc %1 %3 %2)
它意味着
reduce
映射{:b2:a1:c3}
和函数(fn[m[kv]](assoc m v k))
从映射中依次获取一个键值对[kv]
,并将其与累加器哈希映射m
关联。累加器哈希映射的初始状态设置为空({/code>).它意味着减少映射{:b2:a1:c3}
和函数(fn[m[k v]](assoc m v k))
,该函数依次取一个键值