Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何让函数接受相同类型的函数?_Swift - Fatal编程技术网

Swift 如何让函数接受相同类型的函数?

Swift 如何让函数接受相同类型的函数?,swift,Swift,在swift中,是否可能有一个函数接受与自身相同类型的另一个函数 例如,我在python中有一个函数: lambda f:f(f) 我如何在swift中定义这样的函数?那么f的类型是什么呢?你的问题听起来好像你在寻找一种定义f的方法。我不确定是否可以在Swift中实现U组合器行为,但是您可以详细讨论相关的递归闭包 您可以通过定义一个函数来实现Y组合器的行为,该函数将函数的高阶函数作为参数,例如f:(T->U)->(T->U),并返回相同类型的函数,即(T->U)。使用这种方法,您的函数可以将诸

在swift中,是否可能有一个函数接受与自身相同类型的另一个函数

例如,我在python中有一个函数:
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
,将空元组类型作为单个函数参数。空元组
()
是一种类型(typealias
Void
指类型
()
)以及该类型的单个值。由于
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()))