osiire’s blog

ふしぎなそふとやさん

レコードでもバリアントでもうまく表現できない

ある属性attr1はAとBという値を持つ。またある属性attr2はCとDという値を持つ。これをOCamlで表現するとこう。

type t = {
  attr1 : [ `A | `B ];
  attr2 : [ `C | `D ];
}

ただし、attr2のDという値はattr1の値がBの時のみ有効であるという条件を加えると...さぁ困った。これってdependent typeとかいうやつがあれば解決するのかなー?もしそうだとすると、型レベルなんとか万歳。