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式是什么样的?
memoize
function的签名(来自WWDC通话 )是:
func memoize<T: Hashable, U>( body: ((T)->U, T)->U ) -> (T)->U
正如你所看到的,它需要一个正文函数((T)->U, T) -> U
,并返回另一个函数(T) -> U
你可以用你select的任何types的函数来代替T
和U
,并且限制T
必须是Hashable 。
由于这里的函数体(你的尾随闭包 )被显式声明为((Int)->Double, Int)
,所以编译器可以通过复杂的约束求解来推断T == Int
和U == Double
,所以函数返回的memoize
必然是(Int)->Double
。