osiire’s blog

ふしぎなそふとやさん

多相バリアントと抽象化

多相バリアントとして定義している型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