У меня есть функция, которая принимает два аргумента и возвращает одно значение.
Например,
func sum(x: Int, y: Int) -> Int {
return x + y
}
Следующим шагом является использование currying
для получения функции, которая принимаетединственный первый аргумент и вернуть замыкание с соответствующей подписью.Кроме того, я написал псевдоним типа для большей ясности типа результата.
typealias EscapingClosure<A, B> = (A) -> B
func curry<A, B, C>(_ f: @escaping (A, B) -> C) -> EscapingClosure<A, (B) -> C> {
return { (a: A) -> ((_ b: B) -> C) in
return { (b: B) -> C in f(a, b) }
}
}
Но потом я вспомнил о функции uncurry
, которая должна возвращать сигнатуру функции sum
по умолчанию, если я ее применю.на карри результат.Поэтому я попытался реализовать вариант uncurry
, и что я получу в результате:
func uncarry<A, B, C>(_ f: @escaping EscapingClosure<A, (B) -> C>) -> (A, B) -> C {
return { (a: A, b: B) -> C in
return f(a)(b)
}
}
Но вот проблема - я не могу использовать эту функцию uncurry
с результатомcurry для функции sum
, потому что uncurry
требует только @ escape-параметра , где curryied функция возвращает неэкранируемый вариант.
Вот ошибка компилятора Swift:
Cannot convert value of type '((A) -> Void) -> ()' to expected argument type '(_) -> (_) -> _'
Кто-нибудь знает, есть ли какие-либо способы создания функции uncurry
в Swift, которые были бы применимы к результату функции карри.