【问题标题】:How to make a generic memoization function with multiple arguments in Swift?如何在 Swift 中创建具有多个参数的通用记忆函数?
【发布时间】: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 个错误:

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

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

【问题讨论】:

  • 第二个错误很容易理解。您不能使可变参数永久化。就是这么简单。没有可变参数类型;唯一可以使用可变参数的地方是声明函数参数。 actual 参数以数组的形式进入函数,并且不能将其转回可变参数以进行另一个调用(“splatting”,Swift 缺少的语言特性)。
  • 你真的是指T...吗?这意味着所有参数类型必须相同,而不是一个函数可以接受任意数量的不同类型的参数。
  • 感谢 cmets @matt 和 Rob Napier,它帮助我弄清楚我做错了什么????

标签: swift xcode functional-programming memoization chess


【解决方案1】:

感谢 cmets 伙计们。我最终弄明白了(感谢answer

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

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

【讨论】:

    猜你喜欢
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多