簡體   English   中英

錫蘭高階函數

[英]Ceylon Higher Order Function

我有代碼:

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”似乎是不可能的,因為沒有參數調用它,空元組意味着以錫蘭拒絕的想要的超類型調用它。 那么有可能完全調用從i2返回的getInt嗎?

讓我們稍微修改一下示例。

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返回的函數function,但是您需要先對其進行類型檢查:

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東西是不存在的東西的占位符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM