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

Bri*_*lan 4 chapel

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

proc mySum(x:[] int) {
  return + reduce x;
}
proc mySum(x:[] real) {
  return + reduce x;
}
Run Code Online (Sandbox Code Playgroud)

泛型类型的符号是什么?我认为它是类似的东西,proc mySum(x: [] <T>) {}但不起作用.

Bra*_*rad 6

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

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

writeln(mySum([1, 2, 3]));
writeln(mySum([1.0, 2.0, 3.0]));
Run Code Online (Sandbox Code Playgroud)

这会给你:

6
6.0
Run Code Online (Sandbox Code Playgroud)

如果您想要一种以符号方式引用类型的方法,您还可以使用以下语法查询它并将其绑定到标识符(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]));
Run Code Online (Sandbox Code Playgroud)

这会给你:

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
Run Code Online (Sandbox Code Playgroud)

(当然,您也可以执行声明类型变量t等操作)

  • 我没有看到在字符串上添加缩减,这仅仅说明了当前Chapel实现中的一个错误,而没有在原始问题上添加任何值,这是一个有意义或有益的改变,并计划将其回滚或编辑出来. (4认同)
  • @ user3666197 - 我认为你的编辑作为评论会更好,因为它会带来一个单独的主题,即并行减少不是确定性的.此外,通常不赞成进行风格更改,尤其是当它导致响应中的编码风格不一致时. (2认同)