说服GHC说`Maybe Void`是一种单位类型
我有一个类型系列IfEq (n :: Nat) (m :: Nat) o
根据不同的n :== m
计算为o
或Void
。 由于Maybe Void
只能被Nothing
禁用,所以我应该能够定义一个函数Maybe (IfEq nmo) -> Maybe o
但我无法弄清楚。
后续行动:这可以从Maybe
monad扩展到更一般的类型吗? (例如所有MonadPlus
)
编辑:我最初推出了我自己的Nat
但是(谢谢@chi)与GHC Nat
类KnownNat
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