代数データ型 / VariantでExtendしたい

http://www.cs.chalmers.se/~nordland/ohaskell/survey.html

data BW = Black
        | White

data Color > BW = 
   Red | Orange | Yellow | Green | Blue | Violet

このColor > BWっていうのは、というか、'>'わりと気に食わない記号だけれども兎も角拡張したいなーっていう時はあってですね。あります。

そんな事しなくても

data BW = Black | White

data Color = なんか名前を付ける苦しさ BW | Red | Orange | Yellow | Green | Blue | Violet

というのはその場しのぎに成るんですがこれには幾つもの苦しみが在ります。全部は書けませんけど。まぁ5,6個はあるでしょう。

まず、「なんか名前を付ける苦しさ」があります。これは割と大きいです。

名前を考える大変さと、意味的に同じものを「データコンストラクタの名前は全て異ならなければ成らない」という制約から来るそれであえて別にしないといけなかったり・・・。

さらにこの場合だと

f1 :: BW -> Int
f1 Black = 0
f1 White = 1

f2 :: Color -> Int
f2 (なんか名前を付ける苦しさ bw) = f1 bw
f2 _ = 2

みたいな、まぁこの時はまだましですけど、一段パターンマッチする時に深くなるという不快な感じがつきまとうので非常に良く無いなーっていう。

もちろん、純粋に部分型としての機能を利用したい、っていうソレがあるかもしれませんが、ソレ以前に同じような事を別に分けて書く気味悪さみたいなもので胃が痛く成ります。

まぁHaskellはType Class使えるので、変な手間をかけるか、生成を自動化させてしまえば取りあえずは大丈夫なんですけど・・・。

データコンストラクタ間の関係はそれで埋められるとして、しかし関数はそうはいかないです。自分で実装を書かないといけないので。up-castとか挟むのは余りにも残念なそれ(仮にup-castが勝手に定義されても)だと思うので何かワークアラウンドが無いかなぁ。

参考?

http://www.haskell.org/pipermail/haskell/2006-July/018172.html

http://guppy.eng.kagawa-u.ac.jp/~kagawa/PVH/

ざっとしか読んでいないけれども、最初の方のやり方だと多分悲しくて、後半のは手軽に(つまりぷりぷろせさーとかで)片付けられそうにないのでなぁというなぁなぁが・・・。
OlegさんのHListの中身はどうなってるんだろう。これは起きてからかな。

そうかーOCamlにはPolyなVariantなるものがあるんだなー。

http://homepages.cwi.nl/~ralf/OOHaskell/

http://twitter.com/shelarcy/status/4137391122