昇格された型によってインデックス付けされた型を昇格すると、興味深いことが起こります。想像してみてください
data Nat = Ze | Su Nat
その後
data Vec :: Nat -> * -> * where
VNil :: Vec Ze x
VCons :: x -> Vec n x -> Vec (Su n) x
舞台裏では、コンストラクターの内部型は、制約によってインスタンス化された戻りインデックスを表します。
data Vec (n :: Nat) (a :: *)
= n ~ Ze => VNil
| forall k. n ~ Su k => VCons a (Vec k a)
今、次のようなものが許可された場合
data Elem :: forall n a. a -> Vec n a -> * where
Top :: Elem x (VCons x xs)
Pop :: Elem x xs -> Elem x (VCons y xs)
内部形式への変換は次のようにする必要があります
data Elem (x :: a) (zs :: Vec n a)
= forall (k :: Nat), (xs :: Vec k a). (n ~ Su k, zs ~ VCons x xs) =>
Top
| forall (k :: Nat), (xs :: Vec k s), (y :: a). (n ~ Su k, zs ~ VCons y xs) =>
Pop (Elem x xs)
ただし、それぞれの場合の 2 番目の制約を見てください。我々は持っています
zs :: Vec n a
しかし
VCons x xs, VCons y xs :: Vec (Su k) a
しかし、当時定義されていたシステム FC では、等式制約は両側で同じ種類の型を持たなければならないため、この例はそれほど問題ではありません。
修正の 1 つは、最初の制約の証拠を使用して 2 番目の制約を修正することですが、従属制約が必要になります。
(q1 :: n ~ Su k, zs |> q1 ~ VCons x xs)
もう 1 つの修正方法は、15 年前に従属型理論で行ったように、異種方程式を許可することです。必然的に、構文的に明らかではない方法で種類が等しいものの間に方程式が存在します。
現在支持されているのは後者の計画です。私が理解している限りでは、あなたが言及したポリシーは、(Weirich と同僚によって提案された) 異種の平等を備えたコア言語の設計が成熟して実装されるまで、保留中の立場として採用されていました。私たちは興味深い時代に生きています。