欢迎!请参阅关于页面以了解有关此信息的更多信息。
当用单一参数调用时,归约目前不提供一个转换器。
建议
第二个补丁建议一个允许显式初始化值的变体:reductions-with
(assert (= (sequence (reductions-with + 0) [1 2 3 4 5]) [1 3 6 10 15])))
补丁: 0003-add-reductions-with.patch
审核人: Alex Miller
评论由:[email protected] 提出
建议的补丁通过调用无参数的函数来获取归约的"init"值。我想要一个显式"init"的"reductions"转换器,而不是依赖于空函数(f)。
如果我记得正确,Rich 对于支持不带init的reduce(类似于Common Lisp)表示过一些遗憾。我的理解是,对于新的Clojure代码,显式init是首选的。
不幸的是,对于转换器的显式init参数与标准的无init归约(链接:f coll)存在冲突。在我自己的代码中,我为这个转换器使用了"accumulations"这个名字。另一个可能的名字可能是一reductions-with。
评论由:pyr 提出
嗨,Steve,
我非常希望初始化值也能明确地列出,遗憾的是,短于2-arity变体的第二个参数测试—这可能会更加令人困惑—在plain "reductions"中通常没有这样的方法来完成。
我喜欢提供"reductions-with"变体的想法,它强制使用初始化值,如果有必要,我很乐意对补丁进行扩展。
@Steve Miner 我已添加了带reductions-with的变体。
我对推进这件事有什么帮助吗?@alexmiller,关于代码本身有没有什么意见?
评论者:alexmiller
还没来得及看,抱歉。
@alexmiller,如果目的是得到clojure.spec,我将花费一点时间来审阅。
为了进行测试,我建议您将转换器版本的输出与对序列reductions的类似调用进行比较。例如,
`
(is (= (reductions + 3 (range 20)) (sequence (reductions-with + 3) (range 20)))
我希望看到这种一致性。0002补丁在处理init方面并不像当前Clojure reductions那样。
@alexmiller,我再来催促一下,至少让人对补丁和reductions-with变体有个印象,因为1.9版本似乎即将发布。
很抱歉,我不知道我是否能很快地处理这个问题,或者它是否会被考虑进入1.9版本。我也不知道它不会发生,只是...不知道。
@alexmiller,感谢你的及时回复。我正在尝试确保在反馈来临时我会在这里,以便能够快速采取行动。干杯!
@alexmiller,关于这个问题是否有机会被采纳,或者我是否可以以任何方式改进/完善代码,你有什么额外的见解吗?
有机会的时候我会尝试进行预筛选。
我认为我更喜欢reductions-with的方法,而不是将其重载到reductions中。
你有两个解引用@state - 在这里我们做这些假设的情况下,这并不是错误的,但我认为在let中看到单一的state解引用会更加符合风格。
嗨 @alexmiller,只有reductions-with,保持一致性行为,这会更有意义。我添加了第三个补丁,根据你的建议实现了它,避免了双重解引用。
评论由:sickill 提供
注意,我已经在我的 ClojureScript 项目中使用了 Pierre-Yves 的第 3 个补丁提供的 reductions-with 功能,它能够直接使用而无需任何调整。