教堂减少目前忽略变量的初始值。这意味着这段代码
var x: int;
for i in 1..3 {
forall j in 1..10 with (+ reduce x) {
x += 1;
}
}
writeln(x);
返回 10 而不是 30,正如该用户天真地认为的那样。虽然这种行为很好(并且它记录在减少子句的注释中 - 我只是没有认真考虑过),但事实证明,如果我想获得 30(通过在两个循环中累积),我需要实际上是手工计算的。我认为for
循环也有一个reduce
意图会非常优雅和对称......即我想写
var x: int;
for i in 1..3 with (+ reduce x) {
forall j in 1..10 with (+ reduce x) {
x += 1;
}
}
writeln(x);
请注意,即使在求和数字的情况下,我也需要引入一个临时变量。对于像 max/min 这样的操作,需要更加小心。
是否有理由不支持reduce
for 循环内部的意图?或者,是否有更惯用的(Chapel-rrific)方式来做到这一点?
更新:我想得越多,我提出的代码在外部for
被替换为forall
. 我认为问题在于变量是任务本地的而不是迭代本地的,因此减少只会发生在任务上。所以仍然需要一个单独的内部还原步骤。这将消除对临时变量的需要。
我认为更重要的问题是做这些嵌套减少的正确方法是什么......