
Hi Henry, I'm not sure if this is suitable for your use case, but maybe simple multi parameter type classes would be an alternative? Especially because then you could use FunDeps if more dependencies turn up. Like this: class Game gameState command mutable static | gameState -> mutable,static where toGameId :: static -> GameId toMutable :: gameState -> IO (Maybe mutable) everyone :: mutable -> [Sink] instance Game Chess ChessCommand ChessMutable ChessStatic where … Admittedly, the type looks a bit long. But maybe more unification is possible to reduce that. Yet another idea is that instead of sprinkling TypeApplications, you could also try a bit of refactoring: class Game g where data Command g :: * data Mutable g :: * data Static g :: * toGameId :: g -> GameId toMutable :: g -> IO (Maybe (Mutable a)) everyone :: Mutable g -> [Sink] instance Game Chess where data Command Chess = MovePiece { movedPiece :: ChessField, moveTarget :: ChessField } | Castling { withLeftRook :: Bool } | Promote { promotedPiece :: ChessField, promotedTo :: ChessPiece } | EnPassant { enPassantFrom :: ChessField } | GiveUp …