请分享您的想法,参加2024年Clojure状况调查!

欢迎!请参阅关于页面以了解有关此信息的更多信息。

+2
转换器

当用单一参数调用时,归约目前不提供一个转换器。

建议

  • 具有显式初始化值的归约转换器: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"的"reductions"转换器,而不是依赖于空函数(f)。

如果我记得正确,Rich 对于支持不带init的reduce(类似于Common Lisp)表示过一些遗憾。我的理解是,对于新的Clojure代码,显式init是首选的。

不幸的是,对于转换器的显式init参数与标准的无init归约(链接:f coll)存在冲突。在我自己的代码中,我为这个转换器使用了"accumulations"这个名字。另一个可能的名字可能是一reductions-with。

0

评论由:pyr 提出

嗨,Steve,

我非常希望初始化值也能明确地列出,遗憾的是,短于2-arity变体的第二个参数测试—这可能会更加令人困惑—在plain "reductions"中通常没有这样的方法来完成。

我喜欢提供"reductions-with"变体的想法,它强制使用初始化值,如果有必要,我很乐意对补丁进行扩展。

0

评论由:pyr 提出

@Steve Miner 我已添加了带reductions-with的变体。

0

评论由:pyr 提出

我对推进这件事有什么帮助吗?
@alexmiller,关于代码本身有没有什么意见?

0

评论者:alexmiller

还没来得及看,抱歉。

0

评论由:pyr 提出

@alexmiller,如果目的是得到clojure.spec,我将花费一点时间来审阅。

0

评论由:[email protected] 提出

为了进行测试,我建议您将转换器版本的输出与对序列reductions的类似调用进行比较。例如,

`

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

`

我希望看到这种一致性。0002补丁在处理init方面并不像当前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中看到单一的state解引用会更加符合风格。

0

评论由:pyr 提出

嗨 @alexmiller,只有reductions-with,保持一致性行为,这会更有意义。
我添加了第三个补丁,根据你的建议实现了它,避免了双重解引用。

0

评论由:sickill 提供

注意,我已经在我的 ClojureScript 项目中使用了 Pierre-Yves 的第 3 个补丁提供的 reductions-with 功能,它能够直接使用而无需任何调整。

...