Я попробую поиграться потом. Пока что неясно(
можно попробовать написать вручную
data N = Z | S N
data SN n where
SZ :: SN Z
SS :: SN a -> SN (S a)
data SomeN = forall n. (Typeable n, KnownN n) => SomeN (SN n)
class KnownN (a :: N) where
liftN :: N -> Maybe SomeN
instance KnownN Z where
liftN Z = Just (SomeN SZ)
liftN _ = Nothing
instance (Typeable n, KnownN n) => KnownN (S n) where
liftN (S n) = case liftN @n n of
Just (SomeN (n :: SN m)) | Just Refl <- eqT @n @m -> Just (SomeN (SS n))
_ -> Nothing
liftN _ = Nothing