请在 2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面以获取有关此工作方式的更多信息。

+2
转换器

当调用时使用1个参数,当前规约不提供转换器。

建议

  • 具有显式初始化值的规约转换器:reductions-with
  • 由于参数冲突,这是一个独立的函数,而不是与规约结合

第二个补丁建议了一个允许显式初始化值的变体:reductions-with

(assert (= (sequence (reductions-with + 0) [1 2 3 4 5]) [1 3 6 10 15])))

补丁: 0003-add-reductions-with.patch

筛选: Alex Miller

16 答案

0

评论者:[email protected]

建议的补丁通过调用无参数的函数来获取“init”值进行规约。我想要一个“规约”转换器,它可以直接接受显式的“init”,而不是依赖于空参数(f)。

如果我记得正确,Rich 对不支持带init的reduce(类同Common Lisp)表示了一些后悔。我的理解是在新的Clojure代码中,显式init是首选。

不幸的是,对于转换器,显式init参数与标准“不带init”的规约(链接:f coll)会发生冲突。在我的代码中,我已使用“累积”来命名这个转换器。另一个可能的名字可能是“reductions-with”。

0

评论者:pyr

嗨,Steve,

我很愿意显式地提供init值,不幸的是,除了在2参数变体中测试第二个参数之外,就无法在普通的“规约”中做到这一点——这可能会更加令人困惑。

我喜欢提供“规约-with”变体的想法,我很乐意在需要的情况下增加补丁。

0

评论者:pyr

@Steve Miner 我添加了一个带有 reductions-with 的变体。

0

评论者:pyr

有什么我可以帮助推进的吗?
@alexmiller 对于代码本身有什么评论吗?

0

评论者:alexmiller

还没有机会查看,抱歉。

0

评论者:pyr

@alexmiller,如果结果是获得 clojure.spec,我会花点时间审阅这个补丁。

0

评论者:[email protected]

对于测试,我建议您将转换器版本的结果与调用 sequence reductions 相似调用的输出进行比较。例如,

`

(is (= (reductions + 3 (range 20)) (sequence (reductions-with + 3) (range 20)))

`

我希望看到这个等式成立。0002 补丁的处理方式与当前 Clojure reductions 的处理方式不同。

0

评论者:pyr

@alexmiller 我再催一次,至少对补丁和 reductions-with 变体有个概念,因为 1.9 似乎离发布越来越近。

0

评论者:alexmiller

抱歉,我不知道我很快就能处理这个问题,也不知道它会不会被考虑进1.9版本。我不知道它不会,只是……我不知道。

0

评论者:pyr

@alexmiller,感谢您及时的回复。我正在尝试确保在反馈到来时我能在场,以便能够快速处理。干杯!

0

评论者:pyr

@alexmiller,您对这个能否被采纳或者我能否以任何方式修改/完善代码有任何额外的见解吗?

0

评论者:alexmiller

当我有机会时,我会尝试预先筛选它。

0

评论者:alexmiller

我认为我喜欢reductions-with的方法,而不是将重载放入reductions中。

你会发现有两个解引用@state——考虑到我们在这里做出的假设,这并不是错误的,但我认为在let中使用单个状态解引用的样式更受欢迎。

0

评论者:pyr

嗨 @alexmiller,reductions-with看起来更有意义,并且有一致的行为。
我已经添加了第三个补丁,按照您的建议实现了它,避免了双重解引用。

0

评论者:sickill

告知,我在ClojureScript项目中使用了来自Pierre-Yves的第三个补丁的reductions-with,它无需任何调整即可直接工作。

...