Galapagos Tech Blog

株式会社ガラパゴスのメンバーによる技術ブログです。

SwiftでもElmのようなパーサーコンビネータを利用できるようにしてみました。

こんにちは、iOS開発チームの本柳です。

コードのモジュール化について色々考えながら開発していたのですが、 あれこれ考えているうちに勢い余ってgalapagos/HighOrderHelperというライブラリを作ってしまいました。

galapagos/HighOrderHelper ?

このライブラリはElmがコア機能として提供しているHigh-Order Helpersという機能をSwiftに移植したものです*1

galapagos/HighOrderHelperはパイプラインオペレーターや関数合成オペレーター、他に関数を変形するための関数などを含む関数プログラミングを行うための手助けとなるような機能を含んでいます。

このライブラリの機能の一部を紹介しましょう。

パイプラインオペレーター

F#から生まれ、OCamlOSS界に降臨し*2、Elixirに採用されたことでWEB界隈に認知され、その後WEBの力で急速に開発者に浸透していったオペレーター|>です。

Elmでは。Forward apply(|>)、Backward apply(<|)という二種類のパイプラインオペレータがありますが、galapagos/HighOrderHelperを利用すると、これらをSwiftで利用出来るようになります。

このパイプラインオペレーターを利用すると、下記のようにコードを書くことが出来るようになります。

// パイプラインオペレータを使う雰囲気だけご覧頂くためのコード(実際にこのコードが動作するわけではない)
let entity = JSONString
                 |> JSON.parse
                 |> Entity.map

このオペレーターを利用するためには参照透過な関数を用意する必要がありますので、積極的に利用していく結果的に副作用のある処理が少なくなっていくのが嬉しいですよね。

ヘルパ関数

galapagos/HighOrderHelperは提供するオペレーターを利用しやすくするために幾つかのヘルパ関数を用意しています。

ここではflip関数をご紹介します。

以下のような関数があるとします。

func A() -> String {
    return "a"
}

func B(_ a: Int, _ b: String) -> String {
    return "\(a)-\(b)"
}

この時、A() |> (B, 1)のようなコードを書きたいのですが、型が合わないために書くことが出来ません。

flip関数は関数の第一引数と第二引数を入れ替えた関数を返す関数です。

この関数を利用するとA() |> (flip(B), 1)というように書くことが出来るようになります。

このような感じで、ヘルパ関数を利用すると様々なケースにgalapagos/HighOrderHelperは提供するオペレーターを利用出来るようになります*3


galapagos/HighOrderHelperの機能をちょろっとご紹介しました。

詳細はGithubに記載してあるので、興味のある方は是非御覧ください。

さて、ガラパゴスでは勢い余ってライブラリを書いてしまうようなアクティブなエンジニアを募集しております。

ご興味お持ちの方は是非、弊社の採用ページを御覧ください。

www.glpgs.com

たくさんのご応募お待ちしております。


*1:この手のライブラリは何番煎じなんだ?という気もするのですが、Elm Likeという点においてはこいつが初版のはず

*2:実のところOCamlOSS界隈に降臨したかどうかは知りませんので、詳しい方は教えてください

*3:これが、パズルを解いているような感じで楽しいのです!