私は有限の整数セットのためにweaken
関数を書こうとしています。私はsingletons
パッケージを使用しています。私は、加算、減算、および前の関数を定義し、昇格させただけでなく、型チェッカーの助けとなるいくつかの式を証明しました。しかし、私が得ているエラーは、すべてのこととはまったく無関係です。前のNatのSingIを推論できません
weaken :: forall n m k . (SingI n, SingI m, SingI k, (Minus m n) ~ NatJust k) => Fin n -> Fin m
weaken ZF = gcastWith (apply Refl $ plus_minus sm sn sk) ZF
where sn = sing :: SNat n
sm = sing :: SNat m
sk = sing :: SNat k
weaken (SF n) = gcastWith (apply Refl $ succ_pred sm) (SF (weaken n))
where sn = sing :: SNat n
sm = sing :: SNat m
sk = sing :: SNat k
私は取得していますエラーがweaken
(SF (weaken n)
)の再帰呼び出しであると次のようである:n1
が正しくタイプn
のタイプレベルの前任者であることを推測さCould not deduce (SingI n1)
、。 I SingI (Pred n)
という制約を追加することはできますが、これは問題を1レベル下に移動するだけです(GHCは(SingI (Pred (Pred n)))
の相当量を推測できないと言っています)。
SingI (Pred n)
がSingI n
に続くことをGHCに納得させるにはどうすればよいですか(なぜsingletons
パッケージではこれが既に行われていますか)。