2015-12-29 49 views
-1

我试图做SICP练习2.6在迅速大约是church numerals转换方案lambda来迅速关闭

零在方案定义为

(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} 

但问题是附加1的定义是在方案

(define (add-1 n) 
    (lambda (f) (lambda (x) (f ((n f) x))))) 

我无法将其转换为swift闭包版本。一些想法?

谢谢。

+0

所以你基本上要递归lambda表达式? – luk2302

+0

这里是关于在Swift中实现Church编码的另一个问题:http://stackoverflow.com/questions/33597144/swift-higher-order-function-church-pair-order-cons-with-generic-parameter-types。我对这些东西了解不多,但如果我理解正确的话,目前在Swift中是不可能的。 –

+0

@ luk2302没有递归。 – molbdnilo

回答

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