gpt4 book ai didi

swift - Scheme : possible in Swift? 中可爱的 lambda 技巧

转载 作者:可可西里 更新时间:2023-11-01 01:07:59 24 4
gpt4 key购买 nike

很久以前,在一个遥远的星系中,在 Scheme 类(class)中,我们得到了这个 lambda 游戏的例子:

(define (foo x)
(lambda (y) (x (x (x y)))))

现在,显然 ((foo 1+) 0) 将打印 3。(1+ 是标准的 Scheme 增量运算符)但有趣的是,您可以将 foo 应用于自身,然后您可以做一些有趣的事情,例如:

    (((foo foo) 1+) 0)

当然会打印 27。然后是真正有趣的:

(define a (foo foo))
(((a foo) 1+) 0)

我在 CommonLisp、Clojure、Ruby、Python、Haskell、Erlang 和 Julia 中做了这个技巧......

那么问题来了,你能在Swift中做到吗?我知道您可以执行高阶函数,但您能否创建与纯函数式语言一样“自反”的函数?

谢谢!

最佳答案

如果你使 foo 通用,你可以这样做:

func foo<T>(_ x: @escaping (T) -> T) -> (T) -> T {
return { y in x(x(x(y))) }
}

func inc(x: Int) -> Int {
return x + 1
}

foo(inc)(0) // 3
foo(foo)(inc)(0) // 27

因为 foo 是通用的,所以当您尝试定义 a 时,这会失败。

这个:

let a = foo(foo)

不编译。

a 本身需要是通用的,正如@MartinR 在评论中指出的那样,在 Swift 中只有函数可以是通用的。所以 a 必须被定义为一个函数。

这是我的尝试:

func a<T>(_ x: @escaping (T) -> T) -> (T) -> T {
return foo(foo)(x)
}

a(foo)(inc)(0) // this runs for quite a long time ...

关于swift - Scheme : possible in Swift? 中可爱的 lambda 技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53471949/

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