I don't think GADT pattern matching works like this. You have Opp pa constructor as result type. Therefore, if you write something like
f :: Nat 'Even -> ...
f (Succ n) = ...
, Nat (Opp t) ~ Nat 'Even , , Opp t ~ 'Even. , Opp, .
Nat, :
data Nat :: Parity -> * where
Zero :: Nat 'Even
Succ :: Nat (Opp p) -> Nat p
.
, .
() . . , Succ Zero Succ Zero :: Opp p ~ 'Even => Nat p, Nat 'Odd. ok.
, Succ, Opp . Parity Even Odd, , :
data Nat :: Parity -> * where
Zero :: Nat 'Even
Succ :: (Opp (Opp p) ~ p) => Nat (Opp p) -> Nat p
Succ Zero Nat 'Odd, .