根据此manual页面,我们可以使用reduce
进行还原总和(+):
var a = (+ reduce A) / num;
var b = + reduce abs(A);
var c = sqrt(+ reduce A**2);
以及最大值/位置:
var (maxVal, maxLoc) = maxloc reduce zip(A, A.domain);
[Chapel在此将reduce
定义为中缀运算符,而不是函数(例如reduce( A, + )
)。恕我直言,后一种形式似乎更具可读性,因为参数总是用括号分隔。因此,我想知道是出于某种原因(例如简化某些并行语法)还是出于历史原因(约定)?
我会说答案是历史/惯例问题。华盛顿大学的ZPL语言极大地激发了Chapel的许多数组和域功能,我相信这种语法是直接从ZPL直接获得的。
当时,我们没有在Chapel中传递函数和运算符之类的概念,这可能是我们不考虑更多基于函数的方法的原因之一。 (即使现在,Chapel中一流的功能支持仍处于起步阶段,我不相信我们有办法传递运算符。)>
[我也要说Chapel是一种通常偏爱键模式语法的语言,而不是采取更多的“使一切看起来像函数/方法调用”的方法(例如,范围通过文字语法和多个键来支持运算符,而不是将对象类型与方法一起使用)。
这都不是说选择显然是正确的,或者不能被重新考虑。