在 Chapel 中声明一个未知类型数组的函数?

Declare a function on an array of unknown type in Chapel?

我想在数组上写一个函数,但我想要一个泛型。作为论证,让我们把它作为一个总和。

proc mySum(x:[] int) {
  return + reduce x;
}
proc mySum(x:[] real) {
  return + reduce x;
}

泛型类型的表示法是什么?我认为它类似于 proc mySum(x: [] <T>) {} 但那不起作用。

最简单的方法是在正式的类型声明中去掉元素类型:

proc mySum(x:[]) {
  return + reduce x;
}

writeln(mySum([1, 2, 3]));
writeln(mySum([1.0, 2.0, 3.0]));

这会给你:

6
6.0

如果你想有一种符号引用类型的方法,你也可以使用下面的语法来查询它并将它绑定到一个标识符(这里是t):

proc mySum(x:[] ?t) {
  writeln("I'm computing a reduction over an array of ", t:string);
  return + reduce x;
}

writeln(mySum([1, 2, 3]));
writeln(mySum([1.0, 2.0, 3.0]));

这会给你:

I'm computing a reduction over an array of int(64)
6
I'm computing a reduction over an array of real(64)
6.0

(当然你也可以声明t类型的变量等)