2015-03-13 17 views
2

我得到這個功能,這是一個實際使用情況的最小化版本:這會功能斯威夫特被允許(如果它不會崩潰編譯)

func f (i:Int) -> <T> (x:T) -> T { 
    return { x in return x } 
} 

正如你看到的,我想根據某些輸入計算一個通用函數。 但正如您在Xcode或swiftstub中看到的,此函數會使編譯器崩潰。 有誰知道Swift是否應該支持這樣的定義?

+0

它看起來像Haskell中的Rank-1多態性。但在Swift 1.2中,編譯器會拒絕你的代碼。 – findall 2015-03-13 16:25:20

回答

5

當我在1.2b3上試用時,這不再使編譯器崩潰。但是,它不是有效的語法。

如果你想返回其中類型在時間f被稱爲確定的前期的功能,這將做到這一點:

func f<T>(i:Int) -> T -> T { 
    return { x in return x } 
} 

// need to tell the compiler what T actually is... 
let g = f(1) as Int->Int 

g(2) // returns 2 

然而,斯威夫特不支持界定「通用能力「封閉,也就是封閉,封閉的類型不是由創建封閉決定的,而是在實際調用封閉的時候。這需要排名更高的多態性,這是目前還不可用的(儘管將來可能會有人知道 - 這將是一個非常好的功能)。目前,佔位符需要在呼叫站點完全確定。

+1

像往常一樣,最好打開一個錯誤報告/雷達/以加快速度。 – 2015-03-13 16:40:03

1

請記住,Swift泛型的「通用」性質有點用詞不當。通用性只是一個模板符號;所有通用性在編譯時都會被編譯掉 - 也就是說,代碼的一部分中使用的所有泛型都是通過在代碼的另一部分中調用的方式來解析(指定)的。

但是出於這個原因,你不能返回一個通用函數作爲函數的結果,因爲在編譯時沒有辦法解決泛型。因此,儘管編譯器崩潰並不好(Apple想知道它),但是你的代碼也不應該編譯,並且就此而言編譯器是正確的。