指定多态函数的类型以将其作为参数传递

时间:2015-11-19 12:23:09

标签: swift swift2

我有函数curry,它将函数(A, B) -> C作为参数,并返回A -> B -> C。它在函数g(a: Int, b: Int) -> Int上工作正常。此外,我有函数f,这是多态的,所以它的类型是不明确的。这是代码:

func g(a: Int, b: Int) -> Int { return a + b }

func f(a: Int, b: Int) -> Int { return a + b }
func f(a: Float, b: Float) -> Float { return a + b }

func curry<A, B, C>(f: (A, B) -> C) -> A -> B -> C {
  return { a in { b in f(a, b) } }
}

let curriedG = curry(g) //curriedG type Int -> Int -> Int

let curriedF = curry(f) //Error, Ambigous use of 'f(_:b:)'

很明显,我无法做curry(f),但是,有什么方法,我可以指定,我想使用特定的f()实现吗?

为什么我需要这个。 因为初始化者。我想讨论特定的初始化,假设struct A有两个初始化者:init(t: T, y: Y)init(u: U, h: H),我想讨论其中一个。

谢谢!

1 个答案:

答案 0 :(得分:1)

由于$.ajax({ type: "POST", url: serviceName + "/" + div, data: "{'div':'" + div + "', 'currentPageString':'" + currentPage + "', 'pageSizeString':'" + pageSize + "','filter':'" + filter + "'}", contentType: "application/json; charset=utf-8", dataType: "json", processdata: true, success: function(msg) { ServiceSucceeded(msg, div); }, error: function(msg) { ServiceFailed(msg); } }); 已超载,您必须指定所需的f

f

或者,结果应该是什么:

let curriedF = curry(f as (Float, Float) -> Float)