【发布时间】:2017-02-10 03:56:43
【问题描述】:
我正在尝试在 Swift 3 中实现 Church Numerals。目前,我有:
func numToChurch(n: Int) -> ((Int) -> Int) -> Int {
return { (f: (Int) -> Int) -> (Int) -> Int in
return { (x : Int) -> Int in
return f(numToChurch(n: n - 1)(f)(x))
}
}
}
func churchToNum(f: ((Int) -> Int) -> (Int)-> Int) -> Int {
return f({ (i : Int) -> Int in
return i + 1
})(0)
}
在我的函数 numToChurch 的这一行:
return f(numToChurch(n: n - 1)(f)(x))
我不断收到一个编译时错误,“关闭非转义参数 'f' 可能允许它转义”。作为快速修复,我接受了包含@escaping 的建议更改:
func numToChurch(n: Int) -> ((Int) -> Int) -> Int {
return { (f: @escaping (Int) -> Int) -> (Int) -> Int in
return { (x : Int) -> Int in
return f(numToChurch(n: n - 1)(f)(x))
}
}
}
但即使在进行了更改之后,我仍然会收到相同的错误消息,它建议在“f:”之后添加另一个 @escaping。我知道这与将函数参数标记为 @escaping 以告诉编译器可以存储或捕获参数以进行函数式编程有关。但我不明白为什么我不断收到此错误。
原始非转义问题已解决
帮助理解 Swift 中的教堂编码续:
func zero(_f: Int) -> (Int) -> Int {
return { (x: Int) -> Int in
return x
}
}
func one(f: @escaping (Int) -> Int) -> (Int) -> Int {
return { (x: Int) in
return f(x)
}
}
func two(f: @escaping (Int) -> Int) -> (Int) -> Int {
return { (x: Int) in
return f(f(x))
}
}
func succ(_ f: Int) -> (@escaping (Int) -> Int) -> (Int) -> Int {
return { (f : @escaping ((Int) -> Int)) -> Int in
return { (x : Int) -> Int in
return f(n(f)(x))
}
}
}
func sum(m: @escaping ((Int) -> (Int) -> Int)) -> ((Int) -> (Int) -> Int) -> (Int) -> (Int) -> Int {
return { (n: @escaping ((Int) -> Int)) -> (Int) -> (Int) -> Int in
return { (f: Int) -> (Int) -> Int in
return { (x: Int) -> Int in
return m(f)(n(f)(x))
}
}
}
【问题讨论】:
-
欢迎来到 Swift 中的(通常令人沮丧的)FP 世界,或者我们喜欢称之为:“远离 Swift 的舒适区。” :D 但是,这仍然是一个很好的练习;祝你好运,欢迎加入俱乐部!
标签: swift functional-programming swift3 church-encoding church