Swift 如何让函数接受相同类型的函数?
在swift中,是否可能有一个函数接受与自身相同类型的另一个函数 例如,我在python中有一个函数:Swift 如何让函数接受相同类型的函数?,swift,Swift,在swift中,是否可能有一个函数接受与自身相同类型的另一个函数 例如,我在python中有一个函数: lambda f:f(f) 我如何在swift中定义这样的函数?那么f的类型是什么呢?你的问题听起来好像你在寻找一种定义f的方法。我不确定是否可以在Swift中实现U组合器行为,但是您可以详细讨论相关的递归闭包 您可以通过定义一个函数来实现Y组合器的行为,该函数将函数的高阶函数作为参数,例如f:(T->U)->(T->U),并返回相同类型的函数,即(T->U)。使用这种方法,您的函数可以将诸
lambda f:f(f)
我如何在swift中定义这样的函数?那么f的类型是什么呢?你的问题听起来好像你在寻找一种定义f的方法。我不确定是否可以在Swift中实现U组合器行为,但是您可以详细讨论相关的递归闭包
您可以通过定义一个函数来实现Y组合器的行为,该函数将函数的高阶函数作为参数,例如
f:(T->U)->(T->U)
,并返回相同类型的函数,即(T->U)
。使用这种方法,您的函数可以将诸如result之类的函数作为参数
简短的版本是,Y组合子计算
函数——消耗(在本例中,产生)的函数
另一个功能
诀窍是将递归函数定义为函数的不动点
非递归函数,然后写一个定点查找器--
Y组合符——不使用递归
从
现在,由于您返回一个函数,您的返回将“嵌套”在两个步骤中;外部定义闭包的返回,内部定义类型的返回。关键是内部、递归、返回;在没有显式使用输入(参数)函数名的情况下调用输入(参数)函数本身:使用函数参数,如上所述,该函数参数构造为一个闭包类型,可以保存函数本身
func myCombinator<T,U>(f: (T->U) -> (T->U)) -> (T->U) {
return {
(x: T) -> U in
return f(myCombinator(f))(x)
}
}
有关Swift上下文中Y组合符和递归闭包的参考,请参见
稍后回到U combinator,有一个简单的“本机”swift case(然而,它非常无用),它至少模拟了形式
lambda f:f(f)
考虑一个void函数,比如f
,将空元组类型作为单个函数参数。空元组()
是一种类型(typealiasVoid
指类型()
)以及该类型的单个值。由于f
为void(无显式返回),因此它隐式返回一个空元组()
因此,尽管与U组合符没有真正的联系,但您可以编写如下内容
func f(_: ()) { }
var lambda_f = f(f())
lambda_f = f(f(f()))
我认为那是不可能的。对于任何类型的
A
,A->Void
或A->B
都是不同的类型。请在python
中给出一些具体的使用示例lambda f:f(f)
有点模糊。myCombinator必须显式递归吗?
func f(_: ()) { }
var lambda_f = f(f())
lambda_f = f(f(f()))