我正在经历这个blog。当我尝试用自己的方法编写curry函数时:
func stdCurry(f : (A,B) -> C) -> (A)->(B->C) {
return { (a:A) ->(B -> C) in {
(b:B) -> C in
{
return f(a,b)
}
}
}
}
我收到了一个错误:
:7:22:错误:声明关闭结果'C'与上下文类型'_'不兼容 (b:B) - > C in ^ _
但是当我删除尾随闭包周围的花括号时,它不会报告任何错误。任何人都可以帮助我理解这一点。
答案 0 :(得分:2)
内部花括号-> in { ... }
告诉swift这个内部部分是一个闭包,而它实际上只包含一个值(C
的{{1}}类型评估)。如果你删除这些内部花括号,你的例子就可以了。
,例如,尝试
f(a,b)
请注意,我已将通用类型添加到上面的函数签名中(也许您的函数是类的一部分,您可以从那里获取类型func stdCurry<A,B,C>(f : (A,B) -> C) -> (A) -> (B -> C) {
return { (a:A) -> (B -> C) in {
(b:B) -> C in
return f(a,b) // <-- this is not a closure (just returns a value of type C`
}
}
}
,A
和B
)。
为了使上面的错误更清楚,请考虑这个更简单的例子(取一个闭包并返回它):
C
另请注意,由于Swift从您的函数签名中知道(推断)---每个/* This is ok */
func myClosure<A,B>(f: (A) -> B) -> (A) -> B {
return {
x in f(x)
}
}
/* Error: return type here is not (A) -> B, but contains
an anonymous closure () -> B */
func myClosure<A,B>(f: (A) -> B) -> (A) -> B {
return {
x in { f (x) }
}
}
/* Ok */
func myClosure<A,B>(f: (A) -> B) -> (A) -> (() -> B) {
return {
x in { f(x) }
}
}
语句中的类型以及期望的类型/闭包,您可以省略闭包键入(in ...
)以及(a:A) -> (B -> C)
关键字,使表达式更加紧凑,如下所示:
return
根据您在以下评论中的要求:您可以在尾部使用“多个语句”,例如通过使用上面第三个“简单例子”的方法,例如:
func stdCurry<A, B, C>(f: (A, B) -> C) -> A -> (B -> C) {
return { a in { b in f(a, b) } }
}
请注意,由于函数签名有点“混乱”,因此在函数的实际闭包中省略这些细节是有利的,即:
func stdCurry<A,B,C>(f : (A,B) -> C) -> (A) -> (B) -> () -> C {
return { (a:A) -> (B -> () -> C) in {
(b:B) -> () -> C in
return {
// ...
f(a,b)
}
}
}
}