gpt4 book ai didi

swift - 我怎样才能让一个函数接受一个相同类型的函数?

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:35 26 4
gpt4 key购买 nike

在 swift 中,是否可以让一个函数接受另一个与其自身类型相同的函数?

例如,我在 python 中有这个函数:lambda f: f(f)

如何在 swift 中定义这样的函数? f 的类型是什么?

最佳答案

从您的问题来看,您似乎正在寻找一种方法来定义 self-application combinator (/U combinator) .我不确定是否可以在 Swift 中实现 U 组合器行为,但是您可以深入研究相关的 fix-point combinator (/Y combinator)和递归闭包。


您可以通过定义一个函数来实现 Y 组合子的行为,该函数采用函数作为参数来运行高阶函数,比如 f: (T->U) -> ( T->U),并返回相同类型的函数,即(T->U)。使用这种方法,您的函数可以将诸如 result from 之类的函数作为参数。

The short version is that the Y combinator computes the fixed point of a functional -- a function that consumes (and in this case, produces) another function.

The trick is to define recursive functions as the fixed points of non-recursive functions, and then to write a fixed-point finder -- the Y combinator -- without using recursion.

来自 http://matt.might.net/articles/js-church/ .

现在,由于您返回一个函数,您的返回将分两步“嵌套”;外部定义闭包的返回,内部定义类型的返回。关键是内在,递归,return;在没有显式使用其名称的情况下调用输入(参数)函数本身的地方:您使用的函数参数---如上所述---构造为可以容纳函数本身的闭包类型。

func myCombinator<T,U>(f: (T->U) -> (T->U)) -> (T->U) {
return {
(x: T) -> U in
return f(myCombinator(f))(x)
}
}

使用此函数,您可以计算一个数字的阶乘,而无需函数明确引用它们自己的名称

func factorialHelper(recursion: Int -> Int)(n: Int) -> Int {
switch n {
case 0: return 1
default: return n * recursion(n-1)
}
}

let factorial = myCombinator(factorialHelper)
print("\(factorial(4))") // 24

有关 Swift 上下文中的 Y 组合子和递归闭包的引用,请参见例如

这是上面的第二个引用,此答案中的示例来自该引用。


很快回到 U 组合器,有一个简单的“原生”swift 案例(但是,非常无用),它至少模拟了 lambda f: f(f) 的形式。

考虑一个 void 函数,比如 f,将空元组 type 作为单个函数参数。空元组 () 是一种类型(typealias Void 指类型 ())以及该类型的单个值。由于 f 是空的(没有显式返回),它隐式返回一个空元组 () 作为值。

因此——虽然与 U 组合子没有真正的关系——你可以写类似的东西

func f(_: ()) { }
var lambda_f = f(f())

lambda_f = f(f(f()))

关于swift - 我怎样才能让一个函数接受一个相同类型的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34563892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com