Niedawno zacząłem mały hobby project, w którym staram się wprowadzić sztuczną grę w karty Skat (dla 3 graczy). Aby było to możliwe, aby mieć różne rodzaje graczy (jak AI, sieci i lokalnych) gra razem, zaprojektował interface użyciu typeclass Player
:Haskell - Jak uniknąć wpisywania tego samego kontekstu w kółko?
class Monad m => Player p m | p -> m where
playerMessage :: Message answer -> p -> m (Either Error answer,p)
używam StateT
omotać tych trzech graczy:
type PST a b c m x = StateT (Players a b c) m x
Ale teraz, muszę napisać wielki stos w kontekście każdego podpisu typu:
dealCards :: (Player a m, Player b m, Player c m, RandomGen g)
=> g -> PST a b c m (SomeOtherState,g)
Jak można uniknąć pisząc ten duży kontekst raz za razem?
Czy masz swój kod online w dowolnym miejscu? Możesz uzyskać więcej przydatnych porad z większym kontekstem. Kod wydaje mi się czymś, co jest bardziej ogólne niż to, czego naprawdę potrzebujesz, i można go uprościć, specjalizując się tylko w tym, co ma sens, ale nie mogę być tego pewien bez większego kontekstu. –
@camccann Opublikowano na [GitHub] (https://github.com/fuzxxl/Unter). Kod na github jest nieco inny, ponieważ obecnie robię wiele refaktoryzacji, aby moje życie było łatwiejsze. – fuz
@FUXxxl - losowy komentarz - powinieneś określać rozszerzenia na podstawie modułu – alternative