deserialise _ self (Node "Second" [e]) env = do
  Dyn t d <- self e env
  case t of
    App (App tc ta) tb -> do
      case (typeRep @Type `eqTypeRep` typeRepKind t, tc `eqTypeRep` typeRep @(,)) of
        (Just HRefl, Just HRefl) -> return $ Dyn tb (second d)
        _ -> Left $ "Expected type: (" ++ show ta ++ "," ++ show tb ++ "). Found type: " ++ show t
    _ -> Left $ "Expected type: (a,b). Found type: " ++ show t
deserialise _ self (Node "Second" [e]) env = do
  Dyn t d <- self e env
  case t of
    App (App tc ta) tb -> do
      case (typeRep @Type `eqTypeRep` typeRepKind t, tc `eqTypeRep` typeRep @(,)) of
        (Just HRefl, Just HRefl) -> return $ Dyn tb (second d)
        _ -> Left $ "Expected type: (" ++ show ta ++ "," ++ show tb ++ "). Found type: " ++ show t
    _ -> Left $ "Expected type: (a,b). Found type: " ++ show t
deserialise _ self (Node "Second" [e]) env = do
  Dyn t d <- self e env
  case t of
    App (App tc ta) tb -> do
      case (typeRep @Type `eqTypeRep` typeRepKind t, tc `eqTypeRep` typeRep @(,)) of
        (Just HRefl, Just HRefl) -> return $ Dyn tb (second d)
        _ -> Left $ "Expected type: (" ++ show ta ++ "," ++ show tb ++ "). Found type: " ++ show t
    _ -> Left $ "Expected type: (a,b). Found type: " ++ show t