 :returns: A `Result<U>`.
 */
 public func bindAll<T1,T2,T3,U>(r1: Result<T1>, r2: Result<T2>, r3: Result<T3>, f: (T1,T2,T3) -> Result<U>) -> Result<U> {
-    return r1.bind { s1 in
-        r2.bind { s2 in
-            r3.bind { s3 in
-                f(s1, s2, s3)
-            }
-        }
-    }
+    return r1.bind { s1 in bindAll(r2, r3) { f(s1, $0, $1) } }
 }
 
 /**

:returns: A `Result<U>`.
*/
public func bindAll<T1,T2,T3,T4,T5,T6,U>(r1: Result<T1>, r2: Result<T2>, r3: Result<T3>, r4: Result<T4>, r5: Result<T5>, r6: Result<T6>, f: (T1,T2,T3,T4,T5,T6) -> Result<U>) -> Result<U> {
    return r1.bind { s1 in
        r2.bind { s2 in
            r3.bind { s3 in
                r4.bind { s4 in
                    r5.bind { s5 in
                        r6.bind { s6 in
                            f(s1, s2, s3, s4, s5, s6)
                        }
                    }
                }
            }
        }
    }
}

/**

:returns: A `Result<U>`.
*/
public func bindAll<T1,T2,T3,T4,U>(r1: Result<T1>, r2: Result<T2>, r3: Result<T3>, r4: Result<T4>, f: (T1,T2,T3,T4) -> Result<U>) -> Result<U> {
    return r1.bind { s1 in bindAll(r2, r3, r4) { f(s1, $0, $1, $2) } }
}

/**
