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
adefn
变成一个adefn
,你就应该上路了。我更改了标题,因为备忘录与问题无关。是的,这是一个公平的观点。关于不获取列表作为reduce结果的问题与reduce函数接受的参数无关,而不是关于reduce函数返回的值。或者使用适当的reduce
参数使用reduces
。关于不获取列表作为reduce结果的问题与reduce函数接受的参数无关,而是关于reduce函数返回的值。或者使用reduces
和适当的reduce
参数。这太棒了。谢谢既然r
不断增长,那么memoize
不会变得毫无用处吗(因为这里的range
只是为了举例,而真正的序列会有很多重复项)?这太棒了。谢谢既然r
在不断增长,那么memoize
难道不会变得毫无用处吗(当然,这里的range
只是为了举例,而真正的序列会有很多重复)?