Об общем карринге в Swift - PullRequest
0 голосов
/ 03 июня 2018

Я застрял со следующей проблемой:

Вопрос 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.

Что мне не хватает?

...