2015-12-29 2 views
-1

Я пытаюсь сделать 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} 

Но проблема заключается в определении дополнения 1, который находится в схеме

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

Я пока не могу преобразовать это в версию быстрого закрытия. Некоторая идея?

Спасибо.

+0

так что вы в основном хотите рекурсивное лямбда-выражения? – luk2302

+0

Вот еще вопрос о внедрении кодировки в Swift: http://stackoverflow.com/questions/33597144/swift-higher-order-function-church-pair-aka-cons-with-generic-parameter-types. Я мало знаю об этом, но если я правильно понимаю, в Swift это невозможно. –

+0

@ luk2302 Рекурсия отсутствует. – molbdnilo

ответ

0

Я написал следующие две функции для zero и add_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, например, с точки зрения zero и add_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)) 
     } 
    } 
} 
Смежные вопросы