# Pastebin KL6njlbt {-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE TypeFamilies #-} import Data.Kind (Type) import Data.Map (Map) import qualified Data.Map as Map import Data.Set (Set) data Pet = Cat | Dog | Horse data PetState a where Cats :: Map String String -> PetState 'Cat Dogs :: [Int] -> PetState 'Dog Horses :: Set Bool -> PetState 'Horse -- | From package "some". data Some f where Some :: f a -> Some f catState :: Some PetState catState = Some $ Cats (Map.fromList [("meow", "meow")]) dogState :: Some PetState dogState = Some $ Dogs [1, 2, 3] horsesState :: Some PetState horsesState = Some $ Horses mempty processState :: Some PetState -> IO (Some PetState) processState (Some st) = case st of Cats m -> _ Dogs is -> _ Horses s -> _