Swift Memoization调用语法的解释

为了实现recursion函数的memoized版本,我们将函数声明为非变异variables(每个WWDC 2014 – Advanced Swift)。 例如,以下是斐波那契函数的实现:

let fibonacci = memoize { (fibonacci: Int->Double, n: Int) in n < 2 ? Double(n) : fibonacci(n-1) + fibonacci(n-2) } 

任何人都可以解释什么是在斯威夫特? 例如,Swift如何知道斐波那契在上面的代码片段中只有一个参数? 编译器如何解决这个问题? 我们怎么才能知道凡人呢? 编译器语法(Normal Form / CFG)中的语法expression式是什么样的?

memoizefunction的签名(来自WWDC通话 )是:

 func memoize<T: Hashable, U>( body: ((T)->U, T)->U ) -> (T)->U 

正如你所看到的,它需要一个正文函数((T)->U, T) -> U ,并返回另一个函数(T) -> U 你可以用你select的任何types的函数来代替TU ,并且限制T必须是Hashable 。

由于这里的函数体(你的尾随闭包 )被显式声明为((Int)->Double, Int) ,所以编译器可以通过复杂的约束求解来推断T == IntU == Double ,所以函数返回memoize必然是(Int)->Double