Цейлонская функция высшего порядка

У меня есть код:

shared Integer getInt() {
    return 42;
}

shared Integer() i1() {
    return getInt;
}

shared Callable<Integer,Nothing> i2() {
    return getInt;
}

shared Callable<Integer,[]> i3() {
    return getInt;
}

void run() {
    // OK
    i1()();
    // Illegal `[] is not assignable to Nothing`
    i2()();
    // OK
    i3()();
}

Я не уверен, почему компилятор в порядке с объявлением "i2", хотя. Ничто не является подтипом всего и, следовательно, подтипом пустого кортежа, поэтому я могу понять, почему я могу сделать объявление. Но как только я это сделал, мне кажется, что я не могу нормально вызывать "i2", так как вызов его без аргументов, пустой кортеж, означает вызов его с супертипом того, что он хочет, от которого отказывается Цейлон. Так можно ли вообще getInt вернулся с i2?

2 ответа

Давайте немного изменим ваш пример.

shared Integer getInt(Integer x) {
    return 42 + x;
}

shared Integer(Integer) i1() {
    return getInt;
}

shared Callable<Integer,Nothing> i2() {
    return getInt;
}

shared Callable<Integer,[Integer]> i3() {
    return getInt;
}

Как вы упомянули Nothing это подтип []потому что это подтип всего. Это также подтип [Integer],

Тип Callable<Integer, Nothing> описывает любую функцию, которая возвращает Integer, Однако это не говорит, что не требует никаких аргументов.

Можно вызвать функцию, возвращаемую из i2, но вы должны сначала проверить его:

val gi = i2();
if(is Callable<Integer, [Integer, Integer]> gi) {
     gi(1,2);
}

Приведенный выше пример хорошо, потому что [Integer, Integer] присваивается [Integer] и поэтому Callable<Integer, [Integer]> присваивается Callable<Integer, [Integer, Integer]>в качестве параметра второго типа Callable противоречиво

Callable<Integer, Nothing> допустимо, потому что аргумент второго типа должен удовлетворять Anything[], который Nothing делает, потому что, как вы сказали, это подтип каждого типа. Но такая функция никогда не может быть вызвана, потому что она ожидает экземпляр Nothingи такого экземпляра не существует.

Ты можешь сделать apply(i2(), nothing), что делает проверку типов счастливой, но, конечно, просто взрывается во время выполнения, потому что nothing является заполнителем для чего-то, что не может существовать.

Другие вопросы по тегам