型レベルで FizzBuzz

最近、 Type Family, Datatype Promotion, Kind Polymorphism といったあたりの話をいろいろ読んでいたので、練習に型レベルで FizzBuzz を書いてみた。

型レベルの計算の記述は、まだまだ冗長でスマートでない感じだけど、 GHC 7.6.1 で導入されたという Promoted Literals とか、 http://byorgey.wordpress.com/2010/07/19/typed-type-level-programming-in-haskell-part-iii-i-can-haz-typs-plz/ に書かれている Promoted Function? が実現すれば、型レベルでも値レベルとほとんど同じように記述 ( 共有 ) できる、というすごい事になるのだろうか。

ある型のうち一部の複数のデータコンストラクタのみを受け付ける関数を定義する

GADTs を使うと、以下のように、ある型のうち、特定のデータコンストラクタのみを受け付ける関数を書くことができるようになるけど、

これだと、ある型のうち1つのデータコンストラクタだけ受け付ける関数しか定義することができない。指定した複数のデータコンストラクタだけ受け付ける関数を書くにはどうすればよいか少し悩んだのだが、普通に型クラスを使えばよいだけであった。