У меня есть функция curry
, которая принимает функцию (A, B) -> C
в качестве аргумента и возвращает A -> B -> C
. Он отлично работает на функции g(a: Int, b: Int) -> Int
. Кроме того, у меня есть функция f
, то есть полиморфная, поэтому ее тип неоднозначен. Вот код:Укажите тип полиморфной функции, чтобы передать ее в качестве аргумента
func g(a: Int, b: Int) -> Int { return a + b }
func f(a: Int, b: Int) -> Int { return a + b }
func f(a: Float, b: Float) -> Float { return a + b }
func curry<A, B, C>(f: (A, B) -> C) -> A -> B -> C {
return { a in { b in f(a, b) } }
}
let curriedG = curry(g) //curriedG type Int -> Int -> Int
let curriedF = curry(f) //Error, Ambigous use of 'f(_:b:)'
Очевидно, что я не могу сделать curry(f)
, но есть ли способ, чтобы я мог указать, что я хочу использовать конкретные f()
реализации?
Зачем мне это нужно. Из-за инициализаторов. Я хочу получить конкретный инициализатор, скажем, struct A
имеет два инициализатора: init(t: T, y: Y)
и init(u: U, h: H)
, я хочу карри одного из них.
Спасибо!
Это очень ясно и просто. Благодаря! –
Можно ли отличить 'f (a: Int) -> Int' и' f (_ a: Int) -> Int' таким образом? –
@AlfredZien: Я так не думаю. –