2015-11-19 5 views
1

У меня есть функция 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), я хочу карри одного из них.

Спасибо!

ответ

1

С f перегружен, вы должны указать, какие f вы хотите:

let curriedF = curry(f as (Float, Float) -> Float) 

или, в качестве альтернативы, что результат должен быть:

let curriedF = curry(f) as Float -> Float -> Float 
+1

Это очень ясно и просто. Благодаря! –

+0

Можно ли отличить 'f (a: Int) -> Int' и' f (_ a: Int) -> Int' таким образом? –

+0

@AlfredZien: Я так не думаю. –

Смежные вопросы