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,使用函数循环进行映射_Clojure_Functional Programming - Fatal编程技术网

Clojure,使用函数循环进行映射

Clojure,使用函数循环进行映射,clojure,functional-programming,Clojure,Functional Programming,对clojure来说是个新手,所以也许我用了一种完全错误的方式,但是有没有办法做这种事情呢 (地图(周期[+-])[11][11]) 在这个例子中,我希望它返回;(2 0 2) 由于以下帮助,解决方案是: (map (fn [a b c] (a b c)) (cycle [+ -]) [1 1 1] [1 2 3]) 或 简而言之,映射的第一个参数需要是一个应用于集合的每个元素的函数。你得到的是一个函数向量。因此,您需要的是一个函数,它将向量的每个元素应用于其他向量中的相应元素。像这样: (m

对clojure来说是个新手,所以也许我用了一种完全错误的方式,但是有没有办法做这种事情呢

(地图(周期[+-])[11][11])

在这个例子中,我希望它返回;(2 0 2)

由于以下帮助,解决方案是:

(map (fn [a b c] (a b c)) (cycle [+ -]) [1 1 1] [1 2 3])


简而言之,

映射的第一个参数需要是一个应用于集合的每个元素的函数。你得到的是一个函数向量。因此,您需要的是一个函数,它将向量的每个元素应用于其他向量中的相应元素。像这样:

(map #(%1 %2 %3) (cycle [+ -]) [1 1 1] [1 1 1])
对-

#
是匿名函数的缩写,
%
是传递的参数的编号。所以您只是针对
运行
map

(+11)
(-11)
(+11)

肯定是对的,因为我们得出了相同的答案。谢谢,这太棒了!我想知道为什么它对reduce不起作用,比如:(reduce#(%1%2)(cycle[+-])[11000])返回91@user2251284:因为
reduce
map
具有不同的签名
map
将函数作为其第一个参数,然后是任意数量的集合,然后将每个集合中的相应元素传递给函数
reduce
接受两个参数的函数,然后是一个集合或一个初始值和一个集合。为了使用
reduce
,您需要在种子值或数据本身中包含函数循环。类似于
(reduce(fn[acc[f val]](f acc val))0(->[110 100](交错(循环[+]))(分区2))
。有没有一种方法可以用任意数量的循环来实现?比如,如果我的[1]数组也是循环,我想从整个过程的输出中取n。这有意义吗?你是说像这样<代码>(取10(映射(%1%2%3)(循环[+-])(重复1)(重复1))返回延迟序列。您可以对无限序列执行它,并使用
take
来“阻止”它永远运行。另外,请注意,它将运行。。。直到任何一个Coll耗尽。其他Coll中的任何剩余项目都将被忽略。啊,我明白了。我认为%3意味着我只能运行函数3次(每个向量中碰巧有3个元素)。非常感谢你!是的,对不起
#(%1%2%3)
(fn[abc](abc))
(map#(apply%%&)(cycle[+-])[1111][1010][100100]…)的缩写。
(map #(%1 %2 %3) (cycle [+ -]) [1 1 1] [1 1 1])
(map #(%1 %2 %3) (cycle [+ -]) [1 1 1] [1 1 1])
;;(2 0 2)