【发布时间】:2021-01-11 04:09:21
【问题描述】:
我正在制作一个国际象棋引擎(它在很大程度上依赖于函数式编程),它需要在每一步都进行记忆以避免重新计算。我读了这篇文章,它提供了一个通用的记忆功能:
http://simon-fortelny.com/2017/07/04/GenericMemoization/
代码:
func memoize<T: Hashable, U>(function: @escaping (T) -> U) -> (T) -> U {
var cache : [T: U] = [:]
func memoWrapper(input: T) -> U {
if let cacheValue = cache[input] {
return cacheValue
}
let newVal = function(input)
cache[input] = newVal
return newVal
}
return memoWrapper
}
现在我想扩展该函数以接受多个输入参数。我尝试使用这样的可变参数:
func memoize<T: Hashable, U>(function: @escaping (T...) -> U) -> (T...) -> U {
var cache : [[T]: U] = [:]
func memoWrapper(input: T...) -> U {
if let cacheValue = cache[input] {
return cacheValue
}
let newVal = function(input)
cache[input] = newVal
return newVal
}
return memoWrapper
}
但我收到 2 个错误:
- 没有更多上下文,表达类型不明确
- 无法将“[T]”类型的数组作为“T”类型的可变参数传递
知道我做错了什么以及如何让它支持多个参数吗?
【问题讨论】:
-
第二个错误很容易理解。您不能使可变参数永久化。就是这么简单。没有可变参数类型;唯一可以使用可变参数的地方是声明函数参数。 actual 参数以数组的形式进入函数,并且不能将其转回可变参数以进行另一个调用(“splatting”,Swift 缺少的语言特性)。
-
你真的是指
T...吗?这意味着所有参数类型必须相同,而不是一个函数可以接受任意数量的不同类型的参数。 -
感谢 cmets @matt 和 Rob Napier,它帮助我弄清楚我做错了什么????
标签: swift xcode functional-programming memoization chess