欢迎!请查看关于页面以获取有关此工作方式的更多信息。
当调用时使用1个参数,当前规约不提供转换器。
建议
第二个补丁建议了一个允许显式初始化值的变体: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”,而不是依赖于空参数(f)。
如果我记得正确,Rich 对不支持带init的reduce(类同Common Lisp)表示了一些后悔。我的理解是在新的Clojure代码中,显式init是首选。
不幸的是,对于转换器,显式init参数与标准“不带init”的规约(链接:f coll)会发生冲突。在我的代码中,我已使用“累积”来命名这个转换器。另一个可能的名字可能是“reductions-with”。
评论者:pyr
嗨,Steve,
我很愿意显式地提供init值,不幸的是,除了在2参数变体中测试第二个参数之外,就无法在普通的“规约”中做到这一点——这可能会更加令人困惑。
我喜欢提供“规约-with”变体的想法,我很乐意在需要的情况下增加补丁。
@Steve Miner 我添加了一个带有 reductions-with 的变体。
有什么我可以帮助推进的吗?@alexmiller 对于代码本身有什么评论吗?
评论者:alexmiller
还没有机会查看,抱歉。
@alexmiller,如果结果是获得 clojure.spec,我会花点时间审阅这个补丁。
对于测试,我建议您将转换器版本的结果与调用 sequence reductions 相似调用的输出进行比较。例如,
`
(is (= (reductions + 3 (range 20)) (sequence (reductions-with + 3) (range 20)))
我希望看到这个等式成立。0002 补丁的处理方式与当前 Clojure reductions 的处理方式不同。
@alexmiller 我再催一次,至少对补丁和 reductions-with 变体有个概念,因为 1.9 似乎离发布越来越近。
抱歉,我不知道我很快就能处理这个问题,也不知道它会不会被考虑进1.9版本。我不知道它不会,只是……我不知道。
@alexmiller,感谢您及时的回复。我正在尝试确保在反馈到来时我能在场,以便能够快速处理。干杯!
@alexmiller,您对这个能否被采纳或者我能否以任何方式修改/完善代码有任何额外的见解吗?
当我有机会时,我会尝试预先筛选它。
我认为我喜欢reductions-with的方法,而不是将重载放入reductions中。
你会发现有两个解引用@state——考虑到我们在这里做出的假设,这并不是错误的,但我认为在let中使用单个状态解引用的样式更受欢迎。
嗨 @alexmiller,reductions-with看起来更有意义,并且有一致的行为。我已经添加了第三个补丁,按照您的建议实现了它,避免了双重解引用。
评论者:sickill
告知,我在ClojureScript项目中使用了来自Pierre-Yves的第三个补丁的reductions-with,它无需任何调整即可直接工作。