はじめに
この記事は、第2のドワンゴ Advent Calendar 2015最終日の記事です。
私が今年の4月にドワンゴへ中途入社して8ヵ月が経過したらしいです。
仕事とプライベートでやっていることが相変わらずバラバラですが、これはこれで面白いのでいいんじゃないでしょうか。
さて、今回は F# ネタです。
いつもさんざんやってますけど、まードワンゴ社員の中で数少ない(要出典)Microsoft MVPなので、たまには 社員の方々も見そうな場所で F# をアピールしたいんですよ……。
今回のお題
この世にはプリキュアという有名なアニメが存在します1。
詳細は皆さんのほうが詳しいと思うので割愛します。
このプリキュアというアニメの特徴として、一部のユーザがライブラリを開発していることが挙げられます。
有名どころはたぶん下記の3つでしょう。
さて、これらの存在を知っていた当初から感じていたことが1つ。
なぜこのプリキュアライブラリは動的型付き言語ばかりなのだろう、と。
というわけで作りましょう、F# で。
TypeProvider
F# には TypeProvider という機能があります。
TypeProviderがどういったものかというと、簡単に書くと
- コンパイル時にコード生成に頼らずに型を生成する仕組み
です。
基本戦略としては何かしらのデータなどを用いて型を構築することが多いみたいですね。
今回、幸いなことに先人の方々がRubicureApiというAPIを提供して下っているので、このデータをもとに型を生成していきます。
成果物、使い方
成果物は下記リポジトリにあります。
使い方は以下の通り。
open Precure.TypeProviders
// プリキュアのデータが置かれている場所を指定する
type プリキュア = Precure<...>
// シリーズから
let go = プリキュア.``Go!プリンセスプリキュア``
// キャラをとってきて
let towa = go.紅城トワ
// 変身!
let scarlet = towa.``プリキュア!プリンセスエンゲージ!``
時間が足りなかったのでオブジェクトを生成しまくっていますが気にしないでください……。
型はどうなっているの?
今回はプロパティごとに別の型を生成しています。
つまり、"Go!プリンセスプリキュア"というプロパティで取得できるオブジェクトの型はGo!プリンセスプリキュア
型です。キュアスカーレット
も型です。
変身用のプロパティ(メソッドにするつもりだけど時間がなかったのであきらめた)もシリーズごとに異なります。
あと、地味に型ごとのドキュメントとかもつけてます。
というわけで、型が無事生成できたことが確認できたかと思います。
今後の展望
- HListと組み合わせることでシリーズごとの人数をだしたり
- 誕生日の設定があるキャラには誕生日プロパティをはやしたり
- やよいにだけぴかりんじゃんけんを実装したり
- nugetで公開したり
などがあります。
やるかどうかはわかりませんが……。
まとめ
- コンパイル時に型を生成しましょう
- 次の目標は型レベルプログラミングかな?
- 担当日二日前に実装始めたけど間に合ってよかった
-
私はほとんど見ていませんが…… ↩