请在2024 Clojure状态调查!分享您的观点。

欢迎!请查看关于页面以了解更多关于该功能的信息。

+2票数
转换器

当使用1个参数调用时,reductions当前没有提供一个转换器。

提议

  • 具有显式初始化值的归约转换器: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]发表

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

如果记忆准确的话,Rich 表达了一些关于支持没有初始化(类似于Common Lisp)的reduce的遗憾。我的理解是,对于新的Clojure代码,显式初始化更为可取。

不幸的是,根据转换器的显式初始化参数将与标准的"没有初始化"的reductions(链接:f coll)冲突。在我的代码中,我已经使用了"accumulations"这个名字来代表这个转换器。另一个可能的名字可能是"reductions-with"。

0票数

评论由:pyr发表

嗨Steve,

我非常希望初始化值也是显式的,不幸的是,除了在2参数变体中测试第二个参数之外(这可能更加混乱),没有其他方法可以使用纯"reductions"来实现。

我喜欢提供一种"reductions-with"变体,该变体强制使用初始值,如果需要,我将很高兴为补丁添加这个功能。

0票数

评论由:pyr发表

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

0票数

评论由:pyr发表

有什么我可以帮忙推进这个项目吗?
@alexmiller,你对代码本身有什么意见吗?

0票数

评论者:alexmiller

还没有机会查看它,抱歉。

0票数

评论由:pyr发表

@alexmiller,如果最终的目的是实现clojure.spec,我会抽空仔细审查这个补丁:)

0票数

评论由:[email protected]发表

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

`

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

`

我希望看到这种等价性。0002补丁没有像当前Clojure reductions以相同的方式处理init。

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,并且它无需调整就能直接运行。

...