Home > Enterprise >  Generic parameter 'Arg' could not be inferred - generic memoization function
Generic parameter 'Arg' could not be inferred - generic memoization function

Time:11-29

I'm trying to build a generic memoization function

func memoize<Arg: Hashable, Ret>(_ fn: @escaping ((Arg) -> Ret)) -> ((Arg) -> Ret) {
    var cache: [Arg:Ret] = [:]
    func inner (x: Arg) -> Ret {
        let ret = cache[x, default: fn(x)]
        cache[x] = ret
        return ret
    }
    return inner
}

But I am unable to define my function as a closure for some reason

struct Foo: Hashable {
    let a: String
    let b: String
}


let foo = memoize(
    (x: Foo) -> String in {
        print("miss")
        return x.a
    }
)
Cannot convert value of type '((Foo) -> String).Type' to expected argument type '(Arg) -> Ret'

Generic parameter 'Arg' could not be inferred

why is that?

CodePudding user response:

Your closure syntax is incorrect. The signature part goes inside of the { } (See Closure Expression Syntax):

let foo = memoize(
    { (x: Foo) -> String in
        print("miss")
        return x.a
    }
)

You can also omit the () (known as a trailing closure), which is more idiomatic:

let foo = memoize { 
    (x: Foo) -> String in
    print("miss")
    return x.a
}
  • Related