函数参数为泛型类型



我正在制作以下通用记忆函数,不管怎样,它都可以制作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]!
} ()
}
}
}

最新更新