令人信服的GHC“可能无效”是一种单位类型

时间:2017-02-14 14:09:22

标签: haskell void type-families

我有一个类型系列IfEq (n :: Nat) (m :: Nat) o,其评估结果为oVoid,具体取决于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区。

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