我正在尝试在Haxe3.01中编写一个通用函数来汇总数字数组,如下所示:
static public function sum<T:(Int,Float)>(xs:Array<T>):T {
var z:T = 0; //! not OK
for (i in 0...xs.length)
z = z + xs[i];
return z;
}
以上不会编译,haxe说... : Int should be sum.T
,即使在T的类型约束中为Int和Float定义了0然后我试图通过尝试获得零来解决问题类型为T.一个版本是:
@:generic static public function zero<T:(Int,Float)>):T {
var x:T; //! not OK
return x - x;
}
由于x
中的zero()
未初始化,因此无法编译。要初始化它,我需要一些如何在T的类型约束中指定它有一个新的运算符。也许,我可以使用
@:generic static public function zero<T:{function new():Void;}>():T {
var x:T = new T();
return x - x; //! not OK
}
,关注http://haxe.org/manual/haxe3/features。但是,-
运算符未定义。除非有办法初始化<T:(Int,Float)>
类型的局部变量,否则我看不出这是如何工作的。
这可能已经太多了,只是为了获得零。当然,我的问题是如何使用类型参数使这个函数正常工作。
感谢。
- 更新 -
经过一些阅读,我了解到可以使用cast
:
static public function sum<T:(Int,Float)>(xs:Array<T>):T {
var z:T = cast(0);
for (i in 0...xs.length)
z = z + xs[i];
return z; }
这感觉就像是黑客。而且,它不会起作用,例如。如果sum要处理潜在的“Pair”类型,它定义-
并将(0,0)作为零元素。