多相バリアントと抽象化
多相バリアントとして定義している型xとそれを内包するモジュールがあって、ファンクター経由でそのモジュールを使う為に、そのモジュールのシグネチャーを定義したい。もちろん型xは抽象化して。ところが、そのモジュール内にごくまれに型xを拡張した型を含む関数があったりする訳です。しかもファンクター経由で使いたい関数に。例えばこんな感じ。
module type A = sig type x (* 型xを抽象化 *) val f : [ `X of int | x ] list end
ところが、これは
Error: The type x is not a polymorphic variant type
な訳です。うーむ。[ `X of int | x ] を別途抽象化すれば済む話だけど、なんかうまい方法があったりするのかなー?
[追記]
なんかまさにこの話のような気がしてきた。
http://romain.bardou.fr/papers/stage2006p.pdf