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

Параллельная карта монады в Хаскелле? Что-то вроде parMapM?

Я ищу способ запуска двух вычислений параллельно в ST-Monad. Я создаю довольно большой массив (используя STUArray), и я хотел бы сделать это параллельно.

До сих пор я нашел this и this Q & A здесь, в stackoverflow, однако первый не применим в моем случае, поскольку он имеет дело только с чистым кодом, а второй касается монады IO - но я нахожусь в государственном потоке.

Я также нашел пакет monad-parallel, но для этого требуется, чтобы у меня был экземпляр "MonadParallel" для ST. Кроме того, пакет monad-par поддерживает только чистые вычисления или монаду IO.

Есть ли способ сделать параллельное монадическое вычисление внутри ST?

4b9b3361

Ответ 1

Прежде всего, всего двумя словами из вашего вопроса: parallel и array - я должен порекомендовать вас взглянуть на repa. Также вы должны проверить Data Parallel Haskell, так как это promises станет следующей огромной вехой на дороге Haskell и есть некоторые замечательные люди, вовлеченные в этот проект.

В отношении вашего конкретного вопроса есть библиотеки, которые могут выполнять именно то, что вы просите, только с монадой IO, уже названной монадой -parallel и async с mapConcurrently. Считаете ли вы использование stToIO для перехода в IO?

Также существует библиотека снятая-асинхронная, которая расширяет стандартную версию для работы с MonadBaseControl, который имеет экземпляр ST, поэтому вы, вероятно, можете использовать его версию mapConcurrently или, по крайней мере, использовать его как вдохновение для реализации своих собственных.

Ответ 2

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

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

Предоставление нам более подробной информации о том, как вы создаете данные массива, может помочь вам лучше ответить.