如何在 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 个错误:

  1. 表达式类型不明确,没有更多上下文
  2. 无法将“[T]”类型的数组作为 'T'
  3. 类型的可变参数传递

知道我做错了什么以及如何让它支持多个参数吗?

感谢大家的评论。我最终搞清楚了(感谢这个answer

我创建了一个结构来传递给函数而不是多个参数作为可变参数。

struct PairState<T: Hashable, U: Hashable>: Hashable {
    let first: T
    let second: U
}