将scheme lambda转换为swift闭包

时间:2015-12-29 17:02:22

标签: swift lambda scheme closures

我试图在swift中进行SICP练习2.6,大概是church numerals

零在方案中定义为

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

转换为快速关闭我认为是

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

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

但问题是在方案

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

我无法将此转换为快速关闭版本。有些想法?

感谢。

1 个答案:

答案 0 :(得分:0)

我为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))
        }
    }
}