根据此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, + )
)。恕我直言,后一种形式似乎更具可读性,因为参数总是用括号分隔。因此,我想知道是出于某种原因(例如,简化一些并行语法)还是出于历史原因(惯例)?
答案 0 :(得分:4)
我会说答案是历史/惯例问题。华盛顿大学的ZPL语言极大地激发了Chapel的许多数组和域功能,我相信这种语法是直接从ZPL直接获得的。
当时,我们没有在Chapel中传递诸如函数和运算符之类的概念,这可能是我们不考虑更多基于功能的方法的原因之一。 (即使现在,Chapel中的一流功能支持仍处于起步阶段,我不相信我们有办法传递运算符。)
我还要说的是,Chapel是一种通常支持键模式语法的语言,而不是采用更多的“使一切看起来像函数/方法调用”的方法(例如,范围通过文字语法和多个关键运算符,而不是使用带有方法的对象类型。
这并不是说选择显然是正确的,或者是无法重新考虑的。