我正在制作以下通用记忆函数,不管怎样,它都可以制作Fn
类型的通用
func memoize<Arg: Hashable, Ret, Fn: ((Arg) -> Ret)>(_ fn: @escaping Fn) -> Fn {
var cache: [Arg:Ret] = [:]
return {
(x: Arg) -> Ret in
let ret = cache[x, default: fn(x)]
cache[x] = ret
return ret
}
}
我可以这样做,但很难阅读。
func memoize<Arg: Hashable, Ret>(_ fn: @escaping ((Arg) -> Ret)) -> ((Arg) -> Ret) {
Swift中没有函数级类型别名。全局类型别名会让它看起来更糟,因为那样你就会失去箭头。
C#称这一个为";Func
";。
typealias Func<Arg, Ret> = (Arg) -> Ret
func memoize<Arg: Hashable, Ret>(
_ fn: @escaping Func<Arg, Ret>
) -> Func<Arg, Ret> {
所以只需要把它写在多行中,去掉那些多余的括号。(您也不需要显式键入闭包。)
func memoize<Arg: Hashable, Ret>(
_ fn: @escaping (Arg) -> Ret
) -> (Arg) -> Ret {
var cache: [Arg: Ret] = [:]
return { x in
let ret = cache[x, default: fn(x)]
你也可能会发现这样的东西很有用。
return { cache[$0, valueAddedIfNil: fn($0)] }
public extension Dictionary {
subscript(
key: Key,
valueAddedIfNil getValue: @autoclosure() -> Value
) -> Value {
mutating get {
self[key]
?? {
self[key] = getValue()
return self[key]!
} ()
}
}
}