将方案 lambda 转换为 swift 闭包

convert scheme lambda to swift closure

我正在尝试在 swift 中做 SICP 练习 2.6,大约 church numerals

零在方案中定义为

(define zero (lambda (f) (lambda (x) x)))

转换为swift闭包我认为是

let zeroR = {(x:Int)->Int in return x}

let zero = {(f:(Int)->Int)->(Int)->Int in return zeroR}

但是问题是scheme

中add-1的定义
(define (add-1 n)
    (lambda (f) (lambda (x) (f ((n f) x)))))

我还不能将其转换为 swift 关闭版本。有什么想法吗?

谢谢。

我为zeroadd_1写了下面两个函数:

func zero<T>(f: T -> T) -> T -> T {
    return { x in x }
}

func add_1<T>(n: (T -> T) -> T -> T ) -> (T -> T) -> T -> T  {
    return { f in
        return { x in 
            return f(n(f)(x))
        }
    }
}

现在您可以定义 one,例如,根据 zeroadd_1:

func one<T>(f: T -> T) -> T -> T {
    return add_1(zero)(f)
}

也许类似的东西符合您正在寻找的内容?

如果你真的想使用闭包,它看起来像这样,但它失去了使用泛型的能力:

let _zero: (Int -> Int) -> Int -> Int = { _ in
    return { x in x }
}

let _add_1: ((Int -> Int) -> Int -> Int) -> (Int -> Int) -> Int -> Int = { n in
    return { f in
        return { x in
            return f(n(f)(x))
        }
    }
}