Attualmente sto lavorando con i calcoli in ReaderT r (Rand StdGen) a
che vorrei eseguire in parallelo. Mi sono imbattuto in Monad Parallel che sembra che farà quello che voglio.MonadParallel Instance for Rand
C'è già un'istanza di MonadParallel per ReaderT
ma ho dovuto creare il mio per Rand
da monad-random. Tuttavia, non sono sicuro di averlo fatto bene. Non ho molta familiarità con la programmazione parallela in Haskell, ma credo che ci sia da aspettarsi che l'esecuzione di comparse in parallelo debba dare lo stesso valore di quando vengono eseguite normalmente. Poiché la mia istanza di bindM2 per Rand utilizza split
(e quindi ottiene un diverso insieme di numeri casuali dallo stesso generatore iniziale), questo non è il caso della mia istanza.
instance P.MonadParallel (Rand StdGen) where
bindM2 f ma mb = do
split1 <- getSplit
split2 <- getSplit
let a = evalRand ma split1
let b = evalRand mb split2
a `par` b `pseq` f a b
Mentre sento che c'è un caso per ignorare questo (i numeri sono ancora casuali, giusto?) Anche io non posso fare a meno di pensare che mi manca qualcosa. Va bene o c'è una soluzione migliore?
È una domanda interessante - probabilmente non risolvibile senza ripensare come funziona la divisione. Come hai detto, nel mio caso non è esattamente una preoccupazione, ma è certamente un lavoro da tenere d'occhio. –