型レベルプログラミングの会、略して型レ会、行って来ました。メモとか取ってなかったので詳細な感想は書けないのですが、とにかく濃い話が盛りだくさんで面白かったです。このように魅力的なイベントを主催していただいたk.inabaさん、魅力的な発表をしてくださった皆様、会場を提供してくださったサイボウズラボの光成さんに感謝です。
- C++の可変引数テンプレートの便利さに舌を巻いたり
- Haskellの関数従属とか使った型レベルプログラミングの方法にうなったり
- Haskellのtype familyほげほげの話がよくわからなくなってorzしたり
- いけがみさんの発表を聴いて428を買いに行きたくなったり
- Dのテンプレートメタプログラミングの自由さ&読みやすさに感動したり
- G'Camlのgeneric関数のシグネチャの読み方がなかなかわからなくてうなったり
初めて聞く話とか、話は聞いたことあるけど実際にどんなものかよくわかってない事に関する話が多くて、非常にためになりました。特に、Dのテンプレートメタプログラミングは、話には聞いたことがあったのですが、可読性が高くて、さすがによく考えられているなあと感動しました。Nemerleとか好きな自分にとっては自由なメタプログラミング機能は非常に魅力的でした。
あと、懇親会でk.inabaさんたちと、型レベルプログラミングに向いた言語を一から実装してみたいよねなどと話をしていましたが、実際、型レ言語実装の会も機会があればやってみたいですね。
自分の発表について
スライドを書き始めたのが発表の2日前からという突貫工事でしたが、それほど受けは悪くなかったようで、ホッとしました。実は、今回の話はほとんどMetaScalaのソースでやっていることを自分なりに噛み砕いて説明しただけなので、興味がある方はMetaScalaのソースを読まれると良いかもです。反響の多かった型レベルVisitorの話も、元ネタはMetaScalaです。
自分の発表スライドへのリンクを以下に貼っておきます。
そういえば、質問で、型レベル高階関数をScalaで書けるかという話がありましたが、その後、試してみたところ普通に書けました。コードはこんな感じです(MetaScalaのHListはVisitorをAcceptできるようになってなかったので、MetaScalaのコードに若干手を入れてます)。
class MapVisitor[F[_]] extends HListVisitor { type ResultType = HList type VisitHNil = HNil type VisitCons[H, T <: HList] = F[H] :: T#Accept[this.type] } type map[A, B, X <: HList, F[_ <: A] <: B] = X#Accept[MapVisitor[F]] //型レベルmap関数 type L = _2 :: (_3 :: HNil) type plus2[X <: Nat] = X + _2 type M = map[Nat, Nat, L, plus2] // _4 :: (_5 :: HNil) のはず type N = M#Tail#Head // N = _5 val x: _5 = null.asInstanceOf[N] // コンパイル通るはず