2024 年 Clojure 状态调查中分享您的观点!

欢迎!有关如何使用本页的更多信息,请参阅关于页面。

+2投票
变换器

当前在调用时使用1个参数(arity)时,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" 值。我希望有一个 "reductions" 变送器,它将显式 "init",而不是依赖于空函数(f)。

如果我记得正确,Rich 表达了一些关于支持没有初始化的 reduce(类似于 Common Lisp)的后悔之情。我的理解是,明确定义初始化值是较新的 Clojure 代码的首选。

遗憾的是,对于变送器的显式初始化参数会与标准 "没有初始化" 的 reductions(f coll)冲突。在我的个人代码中,我使用 "accumulations" 来命名这种变送器。另一种可能的名称可能是 "reductions-with"。

0投票

评论者:pyr

嗨,Steve,

我非常希望能使初始值同样明确,不幸的是,除了测试二阶变体的第二个参数(这可能会更加混乱)之外,没有其他方法可以使用普通的“reductions”来完成。

我喜欢提供“reductions-with”变体的想法,它强制要求初始值,如果需要,我很乐意在这个补丁中增加这个特性。

0投票
by

评论者:pyr

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

0投票
by

评论者:pyr

我能做些什么来推进这件事吗?
@alexmiller 你对代码本身有什么意见吗?

0投票
by

评论者:alexmiller

还没有时间查看,抱歉。

0投票
by

评论者:pyr

@alexmiller,如果结果能够得到clojure.spec,我会花点时间来审核的 :-)

0投票
by

评论者:[email protected]

对于测试,我建议您比较transducer版本和类似调用sequence reductions的输出。例如,

`

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

`

我想看到这种相等性。0002补丁没有按照当前Clojure reductions的方式处理init。

0投票
by

评论者: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

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

0投票

评论者:sickill

请注意,我在ClojureScript项目中使用了由Pierre-Yves在第三个补丁中提供的reductions-with,它直接工作而无需任何调整。

...