Swiftで関数合成
最近Haskellを勉強していて、関数合成ってSwiftでも書けそうだな〜と思ったので書いてみました。
合成関数の定義を簡単に説明すると、
(f ○ g)(x) = f(g(x))
こんな感じです。
これをSwiftで書くとこうなります。
func +<T, U, W>(lhs: U -> W, rhs: T -> U) -> T -> W { return { (x: T) -> W in return lhs(rhs(x)) } }
どのオペレータが適当なのかわからなかったのでとりあえず(+)で。。。 なんのことはなく、先ほどの式をSwiftに落とし込んだだけです。
関数と関数を引数に取り関数を返す関数ですね。
使い方はこんな感じです。
func add(a: Int)(b: Int) -> Int { return a + b } func multi(a: Int)(b: Int) -> Int { return a * b } let add5 = add(5) let multi10 = multi(10) let multi10AndAdd5 = add5 + multi10 multi10AndAdd5(5) // 55 (add(5) + multi(10))(5) // 短く書くとこうなる
「10をかけて5を足すという関数」に5を渡すと結果は55になりますね。
以上、Swiftで関数合成でした!