说服GHC说`Maybe Void`是一种单位类型

我有一个类型系列IfEq (n :: Nat) (m :: Nat) o根据不同的n :== m计算为oVoid 。 由于Maybe Void只能被Nothing禁用,所以我应该能够定义一个函数Maybe (IfEq nmo) -> Maybe o但我无法弄清楚。

后续行动:这可以从Maybe monad扩展到更一般的类型吗? (例如所有MonadPlus

编辑:我最初推出了我自己的Nat但是(谢谢@chi)与GHC NatKnownNat constrait它很简单,做我上面描述的。 然而,GHC无法推断KnownNat a => KnownNat (1+a) ,这对我来说很重要,所以我回到了方形1。


尝试类似

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
链接地址: http://www.djcxy.com/p/43147.html

上一篇: Convincing GHC that `Maybe Void` is a unit type

下一篇: inferring type class constraint when using associated type families