J'écris du code (autour des stratégies de jeu de cartes) qui utilise State
et la récursivité ensemble. Peut-être que cette partie n'a pas besoin de réellement (elle me semble déjà maladroite, même en tant que débutant relatif), mais il y a d'autres parties qui font probablement ma question générale ...MonadRandom, transformateurs d'état et Monad
Ma première implémentation naïve est entièrement déterministe (le choix de l'offre est tout simplement la première option offerte par la fonction validBids
):
bidOnRound :: (DealerRules d) => d -> NumCards -> State ([Player], PlayerBids)()
bidOnRound dealerRules cardsThisRound = do
(players, bidsSoFar) <- get
unless (List.null players) $ do
let options = validBids dealerRules cardsThisRound bidsSoFar
let newBid = List.head $ Set.toList options
let p : ps = players
put (ps, bidsSoFar ++ [(p, newBid)])
bidOnRound dealerRules cardsThisRound
Et je l'appelle de:
playGame :: (DealerRules d, ScorerRules s) => d -> s -> StateT Results IO()
...
let (_, bidResults) = execState (bidOnRound dealerRules cardsThisRound) (NonEmpty.toList players, [])
maintenant, je suis conscient que je dois apporter aléatoire dans cela et plusieurs autres parties de la code. Ne voulant pas jeter IO
partout, ni passer des graines aléatoires manuellement tout le temps, je pense que je devrais utiliser MonadRandomou quelque chose. Une bibliothèque que j'utilise l'utilise à bon escient. Est-ce un choix judicieux?
Voici ce que j'ai essayé:
bidOnRound :: (DealerRules d, RandomGen g) => d -> NumCards -> RandT g (State ([Player], PlayerBids))()
bidOnRound dealerRules cardsThisRound = do
(players, bidsSoFar) <- get
unless (List.null players) $ do
let options = Set.toList $ validBids dealerRules cardsThisRound bidsSoFar
rnd <- getRandomR (0 :: Int, len options - 1)
let newBid = options List.!! rnd
let p : ps = players
put (ps, bidsSoFar ++ [(p, newBid)])
bidOnRound dealerRules cardsThisRound
mais je suis mal à l'aise déjà, plus peut ne pas fonctionner comment appeler cela, par exemple en utilisant evalRand
en combinaison avec execState
etc. Plus je lis sur MonadRandom
, RandGen
et mtl
vs autres, moins sûr que je suis ce que je fais ...
Comment dois-je combiner soigneusement et State
Randomness et comment faire Je les appelle correctement?
Merci! EDIT: pour référence, full current source on Github.
Wow, c'est génial, merci. Je vais y travailler correctement ce soir. J'aurais dû faire un lien avec la source Github actuelle ... Je vais le faire maintenant. – declension