从WWDC 2014 - 404会议中找出备忘录

时间:2016-12-29 18:00:38

标签: swift functional-programming swift3 closures

我正在努力了解Advanced Swift会话中解释的memoized fibonacci(简单)版本中使用的参数(跳转到00:38:00)

在会话中,定义了以下memoize函数(适用于Swift 3)

func memoize<T: Hashable, U>(body: @escaping (T) -> U) -> (T) -> U {
    var memo = Dictionary<T, U>()
    return { x in
        if let q = memo[x] { return q }
        let r = body(x)
        memo[x] = r
        return r
    }
}

它将包装简单的函数,例如:

let ntos = memoize {(n: Int) -> String in
    print("Must evaluate something")
    return "\(n)"
}

print(ntos(3))
print(ntos(3))
print(ntos(30))

输出:

Must evaluate something
3
3
Must evaluate something
30

ntos的类型为(Int) -> String,因此memoize中的T变为IntU变为String

但是对于斐波纳契函数,苹果正在使用的例子是

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

在这里,我不确定T和U正在调整什么类型?以及函数如何表现递归性质?闭包参数声明fibonacci, n如何转换为类型memoize (T) -> U body参数?

为什么fibonacci甚至在传递给memoize的闭包定义中?我认为它与curried函数的概念有关(在Swift 3中被闭包取代)但实现语法对我来说没有点击。

1 个答案:

答案 0 :(得分:0)

我已经决定更进一步,写了一个完整的成就walk through of memoize