Я застрял со следующей проблемой:
Вопрос 1 - Общее каррирование Создайте протокол с именем Worker с реализацией по умолчанию, которая содержит функцию с именем execute, которая принимает функцию и возвращает функцию,Функция, передаваемая в качестве параметра, должна называться work и принимать в качестве аргумента экземпляр типа, который соответствует протоколу и возвращает универсальный тип T. Выходная функция: () -> T
struct Person {
var name: String
var age: Int
}
protocol Worker {
func perform<A,T>(work: @escaping (A) -> (T)) -> () -> T
}
extension Person: Worker {
func perform<A, T>(work: @escaping (A) -> (T)) -> () -> T {
return //execution of the function work
}
}
Результатом этого должно быть что-то вроде этого:
let person = Person(name: "Bob", age: 3)
let work = person.perform(work: {return "\(person.name) is working"})
print(type(of: work)) // () -> String
print(work()) // Bob is working
Я думаю, что мне нужно вернуть выполнение рабочей функции, переданной в качестве параметра моей функции протокола.
Я правильно думаю?Если да, то как я могу это сделать?
Я уже читал о карри и дженериках, но все еще не могу понять это.
РЕДАКТИРОВАТЬ 1:
Я исправил часть, касающуюся реализации по умолчанию, но до сих пор не могу понять, как вернуть это замыкание.
struct Person: Worker {
var name: String
var age: Int
}
protocol Worker {
func perform<A,T>(work: (A) -> (T)) -> () -> T
}
extension Worker {
func perform<A,T>(work: @escaping (A) -> T) -> () -> T {
return {}
}
}
Я вернулся к своему учебнику, и мне дали следующий пример с каррингом функции:
func curry<A, B, C>(_ f: @escaping (A, B) -> C) -> (A) -> (B) -> C {
return { x in { y in f(x, y) } }
}
Так что, по моему мнению, возвращение моей функции должно быть: 1.Замыкание без аргументов () 2. Внутри замыкания, которое получает аргумент, переданный для работы.
Примерно так:
return {() in {x in work(x)}}
Компилятор выдает мне следующую ошибку:
Cannot convert return expression of type '() -> (A) -> T' to return type '() -> T'
Я не могу понять, почему это происходит, потому что внутреннее замыкание
{x in work(x)}
в моем уме должно возвращать значение типа T, так как это выполнение работы функции,но вместо этого он возвращает (A) -> T.
Что мне не хватает?