如何在haxe中将泛型变量启动为零

时间:2013-12-27 04:59:20

标签: haxe generic-programming

我正在尝试在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)作为零元素。

1 个答案:

答案 0 :(得分:0)

Ints可以隐式转换为浮点数。您可以删除Int约束,只需使用Float。

另请参阅:haxe "should be int" error