关于swift中的通用咖喱语

关于swift中的通用咖喱语,swift,generics,functional-programming,currying,Swift,Generics,Functional Programming,Currying,我遇到了以下问题: 问题1-通用咖喱 创建一个名为Worker的协议,其中包含一个名为perform的函数,该函数接收函数并返回函数执行必须具有默认实现。 作为参数传递的函数应命名为work,并将符合协议的类型的实例作为参数,并返回泛型类型T。输出函数为()->T 我认为我必须返回作为参数传递给协议函数perform的work函数的执行 我想得对吗?如果我是,我怎么能这样做 我已经读过关于咖喱和泛型的书,但我仍然不明白这一点 编辑1: 我修复了关于默认实现的部分,但我仍然不知道如何返回该闭包 s

我遇到了以下问题:

问题1-通用咖喱 创建一个名为
Worker
的协议,其中包含一个名为
perform
的函数,该函数接收函数并返回函数<代码>执行必须具有默认实现。 作为参数传递的函数应命名为
work
,并将符合协议的类型的实例作为参数,并返回泛型类型T。输出函数为()->T

我认为我必须返回作为参数传递给协议函数perform的work函数的执行

我想得对吗?如果我是,我怎么能这样做

我已经读过关于咖喱和泛型的书,但我仍然不明白这一点

编辑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 {}
    }
}
编译器给了我以下错误:

Cannot convert return expression of type '() -> (A) -> T' to return type '() -> T'
我不明白为什么会这样,因为内部关闭

{x in work(x)}
在我看来,应该返回一个类型为T的值,因为它是函数work的执行,但是它返回一个(A)->T

我错过了什么

作为参数传递的函数应命名为
work
,并将符合协议的类型的实例作为参数

Swift将“符合协议的类型”作为
Self
提供。所以
work
的参数应该是
Self
,而不是
A
。您根本不需要
A
类型

protocol Worker {
    func perform<T>(work: @escaping (Self) -> T) -> () -> T
}

首先,我建议你回到你的课本上,找到你家庭作业的答案。问题的关键是“默认实现”,您还需要考虑如何返回一个闭包。“DavidBerry,谢谢,我要检查一下!”DavidBerry我用我的发现对我的问题进行了编辑,但我无法理解返回结束的部分。我解释我的想法在问题编辑中的位置。
return {() in {x in work(x)}}
Cannot convert return expression of type '() -> (A) -> T' to return type '() -> T'
{x in work(x)}
protocol Worker {
    func perform<T>(work: @escaping (Self) -> T) -> () -> T
}
extension Worker {
    func perform<T>(work: @escaping (Self) -> T) -> () -> T {
        return { work(self) }
    }
}