yukia blog

すごいブログ

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で関数合成でした!