我正在尝试weaken
为有限的整数集编写一个函数。我正在使用该singletons
软件包。我已经定义并推广了加法、减法和前驱函数,并证明了它们的一些方程以帮助类型检查器。但是我得到的错误与这一切完全无关。
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)
) 的递归调用中,如下所示:Could not deduce (SingI n1)
, wheren1
被正确推断为 type 的类型级前身n
。我可以添加一个SingI (Pred n)
约束,但这只是将问题降低了一级(GHC 现在说它不能推断出 的等价物(SingI (Pred (Pred n)))
)。
我怎样才能说服SingI (Pred n)
遵循的GHC SingI n
(以及为什么singletons
软件包没有这样做)?