2015-03-13 50 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想知道它),但是你的代码也不应该编译,并且就此而言编译器是正确的。