我有一个类型系列IfEq (n :: Nat) (m :: Nat) o
,其评估结果为o
或Void
,具体取决于n :== m
。由于Maybe Void
仅由Nothing
提供,我应该能够定义一个函数Maybe (IfEq n m o) -> Maybe o
,但我无法弄明白。
跟进:这可以从Maybe
monad推广到更一般的类型吗? (例如,所有MonadPlus
s)
编辑:我最初使用GHC Nat
种类Nat
constrait推出了自己的KnownNat
但是(感谢@chi),我很容易做到我所描述的以上。然而,GHC无法推断KnownNat a => KnownNat (1+a)
这对我来说是必不可少的,所以我回到了第1区。
答案 0 :(得分:2)
尝试类似
的内容foo :: forall n m o . (KnownNat n, KnownNat m) =>
IfEq n m o -> Maybe o
foo x = case sameNat (Proxy :: Proxy n) (Proxy :: Proxy m) of
Just Refl -> Just x
Nothing -> Nothing