CoqのGallinaでは2つのコンストラクタC1, C2のある型Tの式vについて、 if v then t1 else t2 が match v with | C1 ... => t1 | C2 ... => t2 end にdesugarされる。 なんだかよくわからないけどかっこいい!!!Haskellでもこれやりたい!!! やりました。 RebindableSyntaxとGHC.Generics RebindableSyntaxを有効化すると、 リテラルやif式、do式などのセマンティクスを独自に定義することができる。 例えば、if e1 then e2 else e3はifThenElse e1 e2 e3に変換される。ifThenElseを定義すれば、if式の動作を自分の好きなように書き換えられる! GHC.Genericsを使うと、データ型について総称的なプログラミングが行える