2012-04-15 2 views
5

par объявлен как:Haskell: Почему «пар» определил, как это было?

par :: a -> b -> b 

Заметим, что аргумент один отбрасывается. Чтобы использовать пар, вам нужно играть в трюки, например, используя одно и то же выражение несколько раз.

Если его цель состоит в том, чтобы выполнить а и Ь параллельно, почему это не было определено, как это ?:

par :: (a, b) -> (a, b) 

Принимая кортеж (невычисленного) выражений и возвращает те же выражения - в то время как они потенциально материализуется на фоне потоков.

Похоже, что последняя модель проще, чем первая. Почему дизайн был выбран именно так?

+2

Я считаю, ваша версию более трудно думать. Пара, которую вы переходите на пар, может быть необоснованной. Кто оценивает его и когда? – augustss

ответ

8

В первом вы можете легко вызвать более двух вычислений,

c1 `par` c2 `par` c3 `par` c4 `pseq` something c1 c2 c3 c4 

, которые были бы достаточно громоздким в последнем.

+0

Последнее может быть перегружено до 8 аргументов и иметь версию списка. – usr

+0

Обратите внимание, что этот аргумент выброшен, что означает, что только c4 из вашего примера выживет (без дальнейших трюков). – usr

+0

Как вы бы перегружены? 'class par a where' и экземпляры для до 8 кортежей? Тьфу. –

7

tupled версии вы предлагаете может быть найдена как parTuple2 в Control.Parallel.Strategies, с типом:

evalTuple2 :: Strategy a -> Strategy b -> Strategy (a, b) 

А почему пар был разработан таким образом, пар является «высокий уровень », как глава 24 Real World Haskell обсуждает, где они параллелизовать:

быстрой сортировки

Эти изменения в коде замечательны для всех вещей, которые мы не нужны сказать.

  • Сколько ядер использовать.
  • Какие темы для общения друг с другом.
  • Как разделить работу между доступными ядрами.
  • Какие данные разделяются между потоками и являются частными.
  • Как определить, когда все участники закончены.

В A Monad for Deterministic Parallelism, Марий, Ньютон, и Пейтон Джонс пишут:

Номинальная оператор является привлекательным дизайном языка, потому что капитализирует на перекрытии между ленивой оценкой и фьючерсами. Чтобы реализовать ленивую оценку, мы должны иметь представление для выражений , которые еще не оценены, но может потребоваться позднее ; и аналогичным образом будущее представляет собой вычисление, значение которого оценивается параллельно и которое мы можем дождаться. Следовательно, пар был задуман как механизм для аннотирования ленивого вычисления как потенциально прибыльные для оценки параллельно, в силе поворота ленивым вычисления в будущем

Смежные вопросы