swift中的curry函数语法

时间:2016-01-06 10:45:01

标签: swift functional-programming closures

我正在经历这个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   ^   _

但是当我删除尾随闭包周围的花括号时,它不会报告任何错误。任何人都可以帮助我理解这一点。

1 个答案:

答案 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` } } } AB )。

为了使上面的错误更清楚,请考虑这个更简单的例子(取一个闭包并返回它):

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)
        }
        }
    }
}