Параллельная карта монады в Хаскелле? Что-то вроде parMapM?
Я ищу способ запуска двух вычислений параллельно в ST-Monad. Я создаю довольно большой массив (используя STUArray), и я хотел бы сделать это параллельно.
До сих пор я нашел this и this Q & A здесь, в stackoverflow, однако первый не применим в моем случае, поскольку он имеет дело только с чистым кодом, а второй касается монады IO - но я нахожусь в государственном потоке.
Я также нашел пакет monad-parallel, но для этого требуется, чтобы у меня был экземпляр "MonadParallel" для ST. Кроме того, пакет monad-par поддерживает только чистые вычисления или монаду IO.
Есть ли способ сделать параллельное монадическое вычисление внутри ST?
Ответы
Ответ 1
Прежде всего, всего двумя словами из вашего вопроса: parallel и array - я должен порекомендовать вас взглянуть на repa. Также вы должны проверить Data Parallel Haskell, так как это promises станет следующей огромной вехой на дороге Haskell и есть некоторые замечательные люди, вовлеченные в этот проект.
В отношении вашего конкретного вопроса есть библиотеки, которые могут выполнять именно то, что вы просите, только с монадой IO
, уже названной монадой -parallel и async с mapConcurrently
. Считаете ли вы использование stToIO
для перехода в IO
?
Также существует библиотека снятая-асинхронная, которая расширяет стандартную версию для работы с MonadBaseControl
, который имеет экземпляр ST
, поэтому вы, вероятно, можете использовать его версию mapConcurrently
или, по крайней мере, использовать его как вдохновение для реализации своих собственных.
Ответ 2
Я не уверен, что вы можете смело распараллелить монаду ST, или если это даже будет иметь смысл, так как обычно вычисление в государственной монаде зависит от состояния, которое является результатом предыдущих вычислений.
Однако вы могли бы создать массив из списка, а создание списка легко сделать параллельным, например. чем-то вроде parMap
из пакета parallel.
Предоставление нам более подробной информации о том, как вы создаете данные массива, может помочь вам лучше ответить.