Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:带有reduce的匿名函数_Clojure - Fatal编程技术网

Clojure:带有reduce的匿名函数

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参

我是clojure的新手,在clojure文档中注意到了这个例子

(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}
请注意,reduce调用的第二个和第三个参数之间没有分隔符(即空格)。Clojure不需要分隔符

然后,查看内部匿名函数:
(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}
请注意,reduce调用的第二个和第三个参数之间没有分隔符(即空格)。Clojure不需要分隔符

然后,查看内部匿名函数:
(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))
,该函数依次取一个键值