Да, см. параллельный пакет :
ls `using` parList rdeepseq
будет оценивать каждый элемент списка параллельно с помощью стратегии rdeepseq
. Обратите внимание, что использование parListChunk
с хорошим значением порции может повысить производительность, если ваши элементы слишком дешевы, чтобы получить преимущество, оценивая каждый из них параллельно (потому что это экономит на искре для каждого элемента).
РЕДАКТИРОВАТЬ: Исходя из вашего вопроса, я чувствую, что я должен объяснить почему это ответ. Это потому что Хаскелл ленив! Рассмотрим утверждение
let bs = map expensiveFunction as
Ничто не было оценено. Вы только что создали Thunk, который отображает expensiveFunction
. Так как же мы оценим это параллельно?
let bs = map expensiveFunction as
cs = bs `using` parList rdeepseq
Теперь не используйте список bs
в ваших будущих вычислениях, вместо этого используйте список cs
. Итак, вам не нужна параллельная карта, вы можете использовать обычные (ленивые) карты и стратегию параллельной эвакуации.
РЕДАКТИРОВАТЬ: И если вы посмотрите достаточно, вы увидите функцию parMap , которая выполняет то, что я здесь показал, но обернута в одну вспомогательную функцию.
В ответ на ваш комментарий у вас не работает приведенный ниже код? это работает для меня.
import Control.Parallel.Strategies
func as =
let bs = map (+1) as
cs = bs `using` parList rdeepseq
in cs