Bosqueよう分からんな。俺の頭の中では別レイヤーの概念が同じ階層にいる感じがする。

あと、型付き文字列って特別扱いしないと駄目な機能なのか?
TString<PhantomType> = { data : String, phantom:PhantomType }みたいに定義してコンストラクタ隠したらできると思うし、
そしたら文字列に限定せず、0より大きい3の倍数だとかを表現するのにInteger[Zm3]とかやれるべきだけど特に書いてないし。

subtypingはOCamlで慣れてるからそんなに難しくはなさそう。ただ、リストや配列をコンパクトにできるのか自信無い