我正在了解在高级Swift会话中解释的回忆录fibonacci的(简单)版本中使用的参数(跳到00:38:00)。
在会话中,定义了以下回忆录函数(改编自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))产出:
必须评估某事3 3必须评估某事30
ntos的类型是(Int) -> String,所以回忆录中的T变成了Int,U变成了String。
但是对于斐波纳契函数,苹果使用的例子是is。
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参数类型?
为什么斐波纳契甚至在封闭性的定义中通过回忆录?我想,这与咖喱函数(在Swift 3中被闭包所取代)的想法有关,但是实现语法对我来说并没有点击。
发布于 2017-01-01 18:44:35
我决定再往前走一步,写了一个全新的回忆录
https://stackoverflow.com/questions/41384931
复制相似问题