Недавно я начал небольшой , где я пытаюсь реализовать трюковую карточную игру Skat (для 3 игроков). Чтобы иметь возможность играть с разными игроками (например, AI, network и local), я разработал interface с помощью typeclass Player
:
class Monad m => Player p m | p -> m where
playerMessage :: Message answer -> p -> m (Either Error answer,p)
Я использую StateT
для обертывания этих трех игроков:
type PST a b c m x = StateT (Players a b c) m x
Но теперь я должен написать большую кучу контекста в каждой сигнатуре типа:
dealCards :: (Player a m, Player b m, Player c m, RandomGen g)
=> g -> PST a b c m (SomeOtherState,g)
Как я могу избежать записи этого большого контекста снова и снова?