Подтвердить что ты не робот

Почему одновременный haskell не детерминирован, а параллельные примитивы haskell (par и pseq) детерминированы?

Не совсем понимаю детерминизм в контексте concurrency и parallelism в Haskell. Некоторые примеры были бы полезны. Благодаря

4b9b3361

Ответ 1

При работе с чистыми значениями порядок оценки не имеет значения. Это по существу то, что делает parallelism: оценка чистых значений параллельно. В отличие от чистых ценностей, порядок обычно имеет значение для действий с побочными эффектами. Выполнение одновременных действий называется concurrency.

В качестве примера рассмотрим два действия putStr "foo" и putStr "bar". В зависимости от порядка, в котором эти два действия оцениваются, выход представляет собой либо "foobar", "barfoo", либо любое состояние между ними. Результат индивидуализирован, так как зависит от конкретного порядка оценки.

В качестве другого примера рассмотрим два значения sum [1..10] и 5 * 3. Независимо от порядка, в котором эти два оцениваются, они всегда сводятся к тем же результатам. Этот детерминизм - это то, что вы обычно можете гарантировать только чистыми значениями.

Ответ 2

Concurrency и parallelism - две разные вещи.

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

Parallelism - это использование нескольких потоков для простого запуска вашей программы. Однако конечный результат должен быть таким же, как если бы вы выполняли алгоритм последовательно.

У многих языков нет примитивов для parallelism, поэтому вам нужно реализовать его с помощью примитивов concurrency, таких как потоки и блокировки. Однако это означает, что вы, программист, должны быть осторожны, чтобы не случайно вводить нежелательный недетерминизм или другие проблемы concurrency. С явными примитивами parallelism, такими как par и pseq, многие из этих проблем просто исчезают.