将方案 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 关闭版本。有什么想法吗?
谢谢。
我为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))
}
}
}
我正在尝试在 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 关闭版本。有什么想法吗?
谢谢。
我为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))
}
}
}