如何在 Swift 中制作具有多个参数的通用记忆函数?
How to make a generic memoization function with multiple arguments in Swift?
我正在制作一个国际象棋引擎(它严重依赖于函数式编程)并且它需要在每一步都进行记忆以避免重新计算。我读了这篇文章,它提供了一个通用的记忆功能:
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'
类型的可变参数传递
知道我做错了什么以及如何让它支持多个参数吗?
感谢大家的评论。我最终搞清楚了(感谢这个answer)
我创建了一个结构来传递给函数而不是多个参数作为可变参数。
struct PairState<T: Hashable, U: Hashable>: Hashable {
let first: T
let second: U
}
我正在制作一个国际象棋引擎(它严重依赖于函数式编程)并且它需要在每一步都进行记忆以避免重新计算。我读了这篇文章,它提供了一个通用的记忆功能:
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' 类型的可变参数传递
知道我做错了什么以及如何让它支持多个参数吗?
感谢大家的评论。我最终搞清楚了(感谢这个answer)
我创建了一个结构来传递给函数而不是多个参数作为可变参数。
struct PairState<T: Hashable, U: Hashable>: Hashable {
let first: T
let second: U
}