我可以在Swift中使用存储在变量中的函数作为运算符吗



在Swift中,我感兴趣的是定义一个自定义运算符,我可能希望根据上下文更改其实现。基本上,我想这样做:

infix operator <-> {} // define the operator <->

然后,在我的代码中的某个时刻:

let <-> : (Int, Int) -> Int = (+)  // say that here, <-> means +
2 <-> 5 // obtain 7

我仍然希望能够在代码的其他部分中以不同的方式定义<->(可能还有其他参数类型)。我不想声明funcs,因为分配的函数本身实际上来自外部函数调用。

在Swift 1.2中,失败的原因是<->常量的定义中出现错误"Expected pattern"。

我做错了什么?有哪些替代方案?

我能想到的最好的东西是:

infix operator <-> {} // define the operator <->
func <-> (lhs:Int, rhs:Int) -> Int {
    return arrowFunction(lhs, rhs)
}
let arrowFunction : (Int, Int) -> Int = (+)
println("(2 <-> 7)")

我觉得你试图用let绑定实现的东西一开始就不应该被期望起作用(同时与Swift的其他部分保持一致)。。。我不知道足够的PL理论来正确地表达我的观点,但大致上,当你用letvar声明一个名称时,你会预先指定类型(一旦声明了它,类型就会保持固定),但在这里,直到参数真正传递,你才知道实际的类型。

这并不能回答你的问题,但如果你想要的是语法上的甜蜜,这里有一些我想出的代码,可以让你"infixfy"函数。(虽然还没有真正测试过,但你可能需要调整之前的内容。这比其他任何事情都更像是开玩笑。)

func ~<T, U, V>(left: T, f: (T, U) -> V) -> (U -> V) {
    return { y in f(left, y) }
}
func ~<U, V>(g: U -> V, right: U) -> V {
    return g(right)
}
var plus = {(a: Int, b: Int) in a + b }
2~plus~2 // 4
[1, 2, 3, 4, 5, 7, 8]~contains~{$0 == 6} // false

let dot: ([Double], [Double]) -> Double = { v1, v2 in
    return reduce(lazy(Zip2(v1, v2)).map(*), 0, +)
}
func dot: ([Int], [Int]) -> Int {
return 0 // "fake" dot product
}
[1, 2, 3, 4]~dot~[2, 3, 4, 5] // 0
[1.0, 2, 3, 4]~dot~[2, 3, 4, 5] // 40.0

相关内容

  • 没有找到相关文章

最新更新