Шаблон, на який я стикався вже не раз, - це той, де список значень потрібно перевірити, зіставивши якийсь тест над ним і побачивши, чи пройшли якісь або всі елементи. Типове рішення - просто використовувати зручні вбудовані all
та any
.
Проблема полягає в тому, що вони оцінюються послідовно. У багатьох випадках було б набагато швидше оцінити паралельно з завершенням процесу, коли будь-який потік знайде "Неправдивий" all
або "Істинний" для any
. Я майже впевнений, що поведінку короткого замикання неможливо реалізувати за допомогою Control.Parallel, оскільки це вимагає міжпроцесорної комунікації, і я ще не розумію ніде поблизу достатньої кількості Control.Concurrent для цього.
Це досить поширений зразок математики (наприклад, первинність Міллера-Рабіна), тому я відчуваю, що хтось, мабуть, вже знайшов рішення для цього, але з очевидних причин, роблячи пошук в Google за "паралельним або / та / будь-яким / всім у списку" haskell "не дає багато релевантних результатів.
unamb
бібліотекою
pthreads
в С або зеленими нитками в Haskell). Ви не запускаєте кілька веб-серверів для обробки одночасних веб-запитів, натомість ви запускаєте кілька потоків за один процес! Те саме стосується паралелізму. Ви обертаєте стільки потоків, скільки маєте процесори, і розподіляєте свою роботу рівномірно, опікуючись завданнями, пов'язаними з процесором. Спробуйте цю бібліотеку, щоб переконати себе github.com/lehins/haskell-scheduler