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,您好,我有一个简单的函数,如下所示: (def state (memoize (fn state [t] (if (<= t 0) 0 1)))) reduce的语法是(reduce f coll),我的理解是它与执行(reduce+[1 2 3 4 5])一样简单 显然,使用map可以很容易地做到这一点,我只是觉得reduce也可以。使用map时,(map(fn[x](状态x))(范围10)) 附:这只是一个测试用例,我真的需要m

您好,我有一个简单的函数,如下所示:

(def state
  (memoize
    (fn state [t]
      (if (<= t 0)
        0
        1))))
reduce的语法是
(reduce f coll)
,我的理解是它与执行
(reduce+[1 2 3 4 5])
一样简单

显然,使用
map
可以很容易地做到这一点,我只是觉得
reduce
也可以。使用map时,
(map(fn[x](状态x))(范围10))

附:这只是一个测试用例,我真的需要
memorization


感谢

好的,这是因为reduce函数应该正好取2个参数:acculator和coll中的item,但是如果在
reduce
调用期间未提供累加器,则reduce的第一步将应用于coll中的前2个值:

(reduce+”(1234))
实际上是
(+(+(+12)3)4)

但这不是你需要的:

user> (map state (range 10))
(0 1 1 1 1 1 1 1 1 1)

由于您不希望将coll减少为单个值,而是希望将每个值映射为另一个值,这是因为reduce函数应该正好包含两个参数:acculator和coll中的item,但是如果在
reduce
调用期间未提供累加器,还原的第一步应用于coll的前2个值:

(reduce+”(1234))
实际上是
(+(+(+12)3)4)

但这不是你需要的:

user> (map state (range 10))
(0 1 1 1 1 1 1 1 1 1)
因为您不希望将一个coll减少为一个值,而是将每个值映射为另一个值

很明显,使用map可以很容易地做到这一点,我只是觉得reduce也可以

对。任何
map
也可以是
reduce
。(除了reduce不是惰性的,而map是)

reduce函数的结果将是在reduce范围内对函数进行N次迭代后最终返回的结果

函数返回0或1,因此reduce最终将返回0或1

如果要返回列表,则缩减函数需要返回列表。或者,使用reduce以外的函数,例如map

另外——所有的归约函数都有2个参数,而不是1个。因此,您的
状态
函数不是要传递到reduce的有效函数。不过,传递给map是一个有效的函数

顺便说一句,您可以使用reduce来实现这一点,您不需要映射——事实上,许多函数都可以表示为reduce,包括map、filter和其他函数。但是,你需要改变你的归约函数,使之兼容

评论和其他答案建议您必须使用map,但这里有一个reduce:

(def state
     (memoize
       (fn state [r t]
         (if (<= t 0)
             (conj r 0)
             (conj r 1)))))

(reduce state [] (range 10))

;;-> [0 1 1 1 1 1 1 1 1 1]
这更简洁地写为:

(减少(合并%1(状态%2))[](范围10))

很明显,使用map可以很容易地做到这一点,我只是觉得reduce也可以

对。任何
map
也可以是
reduce
。(除了reduce不是惰性的,而map是)

reduce函数的结果将是在reduce范围内对函数进行N次迭代后最终返回的结果

函数返回0或1,因此reduce最终将返回0或1

如果要返回列表,则缩减函数需要返回列表。或者,使用reduce以外的函数,例如map

另外——所有的归约函数都有2个参数,而不是1个。因此,您的
状态
函数不是要传递到reduce的有效函数。不过,传递给map是一个有效的函数

顺便说一句,您可以使用reduce来实现这一点,您不需要映射——事实上,许多函数都可以表示为reduce,包括map、filter和其他函数。但是,你需要改变你的归约函数,使之兼容

评论和其他答案建议您必须使用map,但这里有一个reduce:

(def state
     (memoize
       (fn state [r t]
         (if (<= t 0)
             (conj r 0)
             (conj r 1)))))

(reduce state [] (range 10))

;;-> [0 1 1 1 1 1 1 1 1 1]
这更简洁地写为:


(reduce#(conj%1(state%2))[](范围10))
reduce
只会给你一个“答案”。如果你想要这样的列表,你需要
map
。让你的
def
成为
defn
你就应该上路了。我更改了标题,因为备忘录与问题无关。是的,这是一个公平点
reduce
只会给你一个“答案”。如果你想要这样的列表,你需要
map
。把你的
def
a
defn
变成一个
a
defn
,你就应该上路了。我更改了标题,因为备忘录与问题无关。是的,这是一个公平的观点。关于不获取列表作为reduce结果的问题与reduce函数接受的参数无关,而不是关于reduce函数返回的值。或者使用适当的
reduce
参数使用
reduces
。关于不获取列表作为reduce结果的问题与reduce函数接受的参数无关,而是关于reduce函数返回的值。或者使用
reduces
和适当的
reduce
参数。这太棒了。谢谢既然
r
不断增长,那么
memoize
不会变得毫无用处吗(因为这里的
range
只是为了举例,而真正的序列会有很多重复项)?这太棒了。谢谢既然
r
在不断增长,那么
memoize
难道不会变得毫无用处吗(当然,这里的
range
只是为了举例,而真正的序列会有很多重复)?