2項演算子を閉じ込めるクラス
Operator2.swift
class Operator2<T, U, V>{
private let f: (T, U) -> V
// 2項演算子で初期化できるか試してみる。
init(f:(T, U) -> V){
self.f = f
}
subscript(arg1: T) -> (U -> V) {
get {
return { (arg2: U) -> V in
return self.f(arg1, arg2)
}
}
}
subscript(arg1: T, arg2: U) -> V {
get {
return f(arg1, arg2)
}
}
}
テスト
main.swift
let f: Operator2<Int, Int, Int> = Operator2(+) // '+'演算子で初期化
println(f[3, 7]) // subscriptを使って配列っぽく引数を渡すのはご愛嬌
let f2: Operator2<Double, Double, Double> = Operator2(*) // 今度はかけ算
let f3 = f2[3.14] // 3.14を掛ける関数を得る。
println(f3(2)) // f3はsubscriptと無関係なので普通の括弧で呼び出す。
println(f3(3))
println(f3(4))
一見うさんくさいコードだけど動きます。
感想
subscriptを使うと、わりと関数呼び出しっぽくなる気がする…。
subscript使いまくってすべての関数をカリー化して、[]が関数呼び出しなのか配列の参照なのかわからないぐらいに…とか妄想(…実際にやるとは言わない)。