计算 bool 数组中真正元素的数量

Counting the number of true elements in a bool array

在 Chapel 中,我可以将等于给定值的数组元素数计算为

var a = [1,2,5,5,5];
writeln( a.count( 5 ) );  // this gives 3

但是类似的方法似乎不能用于计算真实元素的数量:

writeln( count( a > 1 ) );
writeln( ( a > 1 ).count( true ) );

在这种情况下,我是否需要编写一个明确的 for 循环,或者是否有任何其他函数(或方法)用于此目的...?


更新

经过更多实验,似乎如果我将 a == 5 的结果保存到一个新数组

var mask = ( a == 5 );

然后它按预期工作

writeln( mask.count( true ) );  // gives 3

所以,a == 5 可能表示与数组对象不同的东西,因此不直接提供 .count()

您遇到的问题是 .count() 方法是在数组上定义的,因此可以在 a 上调用它。但是,表达式 a > 1 不是数组,它是迭代器表达式,并且迭代器表达式(当前)不支持 .count() 方法,也不强制转换为数组(参见*)。
所以这个问题与计算布尔值没有任何关系。
如果你计算数组上其他提升的表达式,你会遇到类似的问题:

var a = [ 1, 2, 5, 5,  5],
    b = [ 2, 4, 6, 8, 10];

writeln( ( a + b ).count( 6 ) );

解决这个问题的两种令人不满意的方法是

(1) 将迭代器表达式转换为数组或
(2) 将迭代器表达式存储到一个数组变量中。
但在 Chapel 中编写此表达式的更典型方法是使用归约:

writeln( + reduce ( a > 1 ) );

*) = 也许这些事情之一应该改变......