Tôi đang cố gắng để hiểu tại sao chúng ta cần tất cả các phần của mã mẫu tiêu chuẩn:Tại sao chúng ta cần 'seq' hoặc 'pseq' với 'par' trong Haskell?
a `par` b `pseq` a+b
Tại sao sẽ không sau đây là đủ?
a `par` b `par` a+b
Các biểu thức trên có vẻ rất mô tả: Cố gắng để đánh giá cả a
và b
song song, và trả lại kết quả a+b
. Là lý do duy nhất hiệu quả: phiên bản thứ hai sẽ phát ra hai lần thay vì một lần?
Phiên bản ngắn gọn hơn, ngắn gọn hơn như thế nào?
a `par` a+b
Tại sao chúng ta cần phải chắc chắn b
được đánh giá trước khi a+b
như trong bản gốc, mã tiêu chuẩn?
Điều này đúng và cũng giải thích tại sao 'seq' không đủ cho vấn đề này. 'seq' không đảm bảo về thứ tự đánh giá. Trong 'seq b (a + b)', luồng chính có thể đánh giá 'a' trước' b' miễn là 'b' nằm trong WHNF khi' (a + b) 'được đánh giá. –
Tôi không thấy cách đối số đó mô tả vấn đề với 'par a (mệnh b (a + b))' - chắc chắn, hoặc 'a' hoặc' b' sẽ được đánh giá ngay lập tức, và tia lửa tương ứng sẽ biến mất, nhưng tia lửa khác nên sống rất nhiều, tạo ra sự song song. Tất nhiên, tạo ra sau đó fizzling một tia lửa có thể không phải là cách hiệu quả nhất để làm điều này, nhưng nó hoạt động và để lại câu hỏi để đánh giá trình biên dịch. – gereeter
Trong trường hợp của 'par a (a + b)', nó vẫn có thể nhận được một "may mắn" song song, nếu thời gian chạy thay vì chọn 'b' đầu tiên. Sau đó, tia lửa "a' sẽ không bị xáo trộn. Điều này được đề cập trong PDF: community.haskell.org/~simonmar/papers/threadscope.pdf (trang 2) – CMCDragonkai