Tôi hiện đang làm việc với các tính toán trong ReaderT r (Rand StdGen) a
mà tôi muốn chạy song song. Tôi đã đi qua Monad Parallel mà có vẻ như nó sẽ làm những gì tôi muốn.MonadParallel Instance cho Rand
Đã có bản sao của MonadParallel cho ReaderT
nhưng tôi phải tạo của riêng mình cho Rand
từ monad-random. Tuy nhiên, tôi không chắc là tôi đã làm đúng. Tôi không quá quen thuộc với lập trình song song trong Haskell, nhưng tôi tin rằng có một kỳ vọng rằng việc chạy các định dạng trong song song sẽ cho cùng một giá trị như khi chúng chạy bình thường. Bởi vì thể hiện của tôi về bindM2 cho Rand sử dụng split
(và do đó nhận được một tập hợp các số ngẫu nhiên khác từ cùng một trình tạo ban đầu), đây không phải là trường hợp của cá thể của tôi.
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
Trong khi tôi cảm thấy có trường hợp bỏ qua điều này (các con số vẫn ngẫu nhiên, phải không?) Tôi cũng không thể cảm thấy rằng mình đang thiếu thứ gì đó. Điều này có ổn không hoặc có giải pháp tốt hơn không?
Đây là một câu hỏi thú vị - có thể không giải quyết được mà không suy nghĩ lại cách phân chia hoạt động. Như bạn đã nói, trong trường hợp của tôi nó không chính xác là một mối quan tâm nhưng nó chắc chắn làm việc giữ một mắt trên. –