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

欢迎!有关本网站的更多信息,请参阅 关于 页面。

+2
转换器

当使用 1 参数调用时,reductions 不会提供转换器。

提议

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

第二个补丁提议一个允许显式初始化值的变体: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]

建议的补丁通过调用无参数的函数来获取reductions的"init"值。我希望有一个接受显式"init"的"reductions"转换器,而不是依赖于空一元算子(f)。

如果我记得正确,Rich 表达了对支持不带 init 的 reduce(类似于 Common Lisp)的遗憾。我理解,显式 init 更适合新的 Clojure 代码。

不幸的是,为转换器提供显式 init 参数会与标准"无 init" reductions(链接:f coll)发生冲突。在我的代码中,我使用"accumulations"作为这个转换器的名称。另一个可能的名字可能是"reductions-with"。

0

评论者:pyr

嗨Steve,

我更希望显式地将 init 值指定出来,不幸的是,除了在 2 参数变体中测试第二个参数之外(这可能会更加令人困惑),没有其他方法可以用纯"reductions"来实现这一点。

我喜欢提供"reductions-with"变体的想法,该变体强制init值,如果需要,我很愿意在补丁中增加这一点。

0

评论者:pyr

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

0

评论者:pyr

我能做些什么来推进这件事吗?
@alexmiller,对代码本身有什么评论吗?

0

评论者:alexmiller

还没机会查看它,抱歉。

0

评论者:pyr

@alexmiller,如果得到 clojure.spec 并且需要花点时间审查,我可以接受的。

0

评论者:[email protected]

对于测试,我建议你比较 transducer 版本和类似调用 sequence 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中看到一个单一的状态反引用会更符合风格。

0

评论者:pyr

嗨@alexmiller,我觉得只有一个reductions-with会更有意义,行为更一致。
我已经添加了第三个补丁,按照您的建议实现它,避免了双重反引用。

0

评论由:sickill做出

仅供参考,我已经在ClojureScript项目中使用了Pierre-Yves的第三版补丁中的reductions-with,并且它无需调整就能直接工作。

...