a `par` b `par` a+b
создает искры как для a
, так и для b
, но a+b
достигается немедленно, поэтому одно из искр вспыхивает (т.е. оно оценивается в основном потоке). Проблема заключается в эффективности, так как мы создали ненужную искру. Если вы используете это для реализации параллельного разделения и завоевания, накладные расходы ограничат ваше ускорение.
a `par` a+b
кажется лучше, потому что он создает только одну искру. Однако попытка оценить a
до b
приведет к искре для a
, а поскольку у b
нет искры, это приведет к последовательной оценке a+b
. Переключение порядка на b+a
решило бы эту проблему, но как код это не навязывает порядок, и Haskell все равно может оценить это как a+b
.
Итак, мы делаем a `par` b `pseq` a+b
, чтобы форсировать оценку b
в главном потоке, прежде чем пытаться оценить a+b
. Это дает возможность возникновения искры a
, прежде чем мы попытаемся оценить a+b
, и мы не создали ненужных искр.