型レベル数値リテラルを使って型レベルFizzBuzz

型レベルFizzBuzz(及び、type familyにおけるガードの書き方) - claustrophobiaを見て自分も型レベルFizzBuzz書いてみました。 GHC 7.8以降で動作します。

Natを受け取るとFBkindを持つ型を返すFizzBuzz型族と、FBに対するsingletonになるSFB型を定義して、 あとは型からsingletonを生成してそれをprintしています。

SNumberT 1
SNumberT 2
SFizzT
SNumberT 4
SBuzzT
SFizzT
SNumberT 7
SNumberT 8
SFizzT
SBuzzT
SNumberT 11
SFizzT
SNumberT 13
SNumberT 14
SFizzBuzzT
SNumberT 16