haxe должен быть ошибкой int

Haxe, кажется, предполагает, что некоторые вещи должны быть Int. В следующей функции

class Main {
    static function main() {
        function mult_s<T,A>(s:T,x:A):A { return cast s*x; }
        var bb = mult_s(1.1,2.2);
    }
}

Я получил (с Haxe 3.01):

Main.hx:xx: characters 48-49 : mult_s.T should be Int
Main.hx:xx: characters 50-51 : mult_s.A should be Int

Кто-нибудь может объяснить, почему T и A должны быть Int вместо Float?


Более загадочный пример:

class Main {
    public static function min<T:(Int,Float)>(t:T, t2:T):T { return t < t2 ? t : t2; }
    static function main() {
        var a = min(1.1,2.2); //compile error
        var b = min(1,2); //ok
    }
}

Я не понимаю, почему t<t2 подразумевает, что либо t, либо t2 - это Int. Но Haxe, кажется, предпочитает Int: min хорошо, если вызывается с Int, но терпит неудачу, если вызывается с Float. Это разумно?

Спасибо,


person tinlyx    schedule 03.02.2014    source источник


Ответы (1)


min<T:(Int,Float)> означает, что T должно быть и Int и Float. См. раздел ограничений руководства Haxe. .

Учитывая, что Int можно неявно преобразовать в Float, вы можете безопасно удалить ограничение Int. то есть будет работать следующее:

http://try.haxe.org/#420bC

class Test {
  public static function min<T:Float>(t:T, t2:T):T { return t < t2 ? t : t2; }
  static function main() {
    var a = min(1.1,2.2); //ok
    $type(a); //Float
    trace(a); //1.1
    var b = min(1,2); //ok
    $type(b); //Int
    trace(b); //1
  }
}
person Andy Li    schedule 03.02.2014
comment
Спасибо за Ваш ответ. min‹T:(Int,Float)› означает, что T должен быть как Int, так и Float, есть ли ссылка на это? - person tinlyx; 04.02.2014
comment
Кроме того, вторая строка var b = min(1,2); , я ожидал, что b будет Int. Но в вашем случае это действительно Float, не так ли? - person tinlyx; 04.02.2014
comment
Я только что обновил ответ. Тип возвращаемого значения minT, который также является типом аргументов функции t и t2. Поэтому, когда вы поместите Int внутрь, он вернет Int. - person Andy Li; 04.02.2014
comment
Спасибо за разъяснения. Ссылка действительно предполагает, что ограничения <T:(Measurable,Iterable>) должны быть как измеримыми, так и итерируемыми. Все еще странно думать, как что-то может быть и Int, и Float. Что, если речь идет о <T:(String,Float)>, притворяясь, что мы можем сравнивать строки. - person tinlyx; 08.02.2014
comment
Кстати, код в вашем примере выдает сообщение об ошибке компиляции: Test.hx:4: characters 18-21 : Float should be Int Test.hx:4: characters 18-21 : For function argument 't2' о строке var a = min(1.1,2.2); - person tinlyx; 08.02.2014
comment
Ааа, в коде try-haxe была опечатка, 1 должно быть 1.1. Я обновил код и ссылку. - person Andy Li; 08.02.2014
comment
К сожалению, на данный момент нет синтаксиса для ограничений или. Решение этой проблемы требует использования абстрактного типа: try.haxe.org/#17b58 - person Andy Li; 08.02.2014