Вот как я бы перевел вашу Java-программу в параллельную программу на Haskell:
parCompute ts = sum (computes `using` parListChunk 100 rseq)
where
computes = zipWith f ts (tail (tails ts))
f t tls = 5 * t - 3 * sum tls
Прежде всего - да, введение строгости - это хорошая идея. С другой стороны, GHC достаточно умен, чтобы заметить это! Фактически, используете ли вы foldl
, foldl'
или просто sum
, сгенерированный код точно такой же.
Для оценки списка в сегментах вы можете просто использовать стратегию разбиения на фрагменты, как указано выше. Однако объем работы, представляемой каждым чанком, может сильно отличаться, поэтому вы можете попытаться выровнять его, сделав более крупные чанки для конца списка. Кроме того, я не думаю, что здесь есть много возможностей для улучшения.