在 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
类型的变量等)
我想在数组上写一个函数,但我想要一个泛型。作为论证,让我们把它作为一个总和。
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
类型的变量等)