Mapa równoległa na tablicach Repa

W moim ostatnimpraca zGibbs sampling, Świetnie korzystałem zRVar który, moim zdaniem, zapewnia niemal idealny interfejs do generowania liczb losowych. Niestety, nie mogłem skorzystać z Repa z powodu niemożności użycia akcji monadycznych na mapach.

Chociaż wyraźnie monadyczne mapy nie mogą być w ogóle zrównoleglone, wydaje mi się, że takRVar może być co najmniej jednym przykładem monady, w której efekty mogą być bezpiecznie równoległe (przynajmniej w zasadzie; nie jestem zbyt dobrze zaznajomiony z wewnętrznym działaniemRVar). Mianowicie chcę napisać coś takiego,

drawClass :: Sample -> RVar Class
drawClass = ...

drawClasses :: Array U DIM1 Sample -> RVar (Array U DIM1 Class)
drawClasses samples = A.mapM drawClass samples

gdzieA.mapM wyglądałby jak coś,

mapM :: ParallelMonad m => (a -> m b) -> Array r sh a -> m (Array r sh b)

Oczywiście, jak to działa, zależy przede wszystkim od wdrożeniaRVar i jego podstawyRandomSource, w zasadzie można by pomyśleć, że pociągałoby to za sobą losowanie nowego losowego materiału siewnego dla każdego wątku i kontynuowanie go jak zwykle.

Intuicyjnie wydaje się, że ten sam pomysł może uogólnić na inne monady.

Moje pytanie brzmi: czy można zbudować klasęParallelMonad monad, dla których efekty mogą być bezpiecznie równoległe (prawdopodobnie zamieszkane przez, co najmniej,RVar)?

Jak to może wyglądać? Jakie inne monady mogą zamieszkać w tej klasie? Czy inni rozważali możliwość, jak to może działać w Repa?

Wreszcie, jeśli tego pojęcia równoległych działań monadycznych nie można uogólnić, czy ktoś widzi jakiś fajny sposób na wykonanie tej pracy w konkretnym przypadkuRVar (gdzie byłoby to bardzo przydatne)? Poddawać sięRVar dla równoległości jest to bardzo trudny kompromis.

questionAnswers(1)

yourAnswerToTheQuestion