2015-12-29 56 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)) 
     } 
    } 
}