Обновление : я только что нашел эту страницу документации . Хотелось бы, чтобы на него была ссылка из документации, которую я использовал , которая казалась окончательной документацией API. Но, возможно, это новая, неизданная работа.
Обновление 2 : Эта документация дала мне гораздо лучшее представление о том, как использовать модуль Control.Parallel.Strategies. Однако я не совсем решил проблему ... см. Конец вопроса.
Я пытался использовать parListChunk или некоторые другие функции параллельного управления в Haskell. Но я не могу понять, как их использовать. Предупреждение: я новичок в Haskell. Я узнал кое-что о функциональном программировании с помощью Scheme около 20 лет назад (!).
Вот моя непараллельная функция:
possibKs n r = [ (k, (hanoiRCountK n k r)) | k <- [1 .. n-1] ]
Я хочу распараллелить ее, что-то вроде этой наивной попытки:
possibKs n r
| n < parCutoff = results
| otherwise = parListChunk parChunkSize results
where results = [ (k, (hanoiRCountK n k r)) | k <- [1 .. n-1] ]
Но эта структура не ' Правильно для parListChunk. В документации говорится:
parListChunk :: Int -> Strategy a -> Strategy [a]
parListChunk последовательно применяет стратегия для фрагментов (подпоследовательностей) список параллельно. Полезно для увеличения размер зерна
Хорошо, вот что я хочу. Но как им пользоваться? Мне не удалось найти никаких примеров этого. Если я понимаю объявление типа, parListChunk - это функция, которая принимает Int
и Стратегию
(заимствуя нотацию параметризованного типа C ++, чтобы проверить, действительно ли я понимаю это справа) и возвращает Стратегию
. В моем случае я имею дело с Int
для a
, поэтому parListChunk потребуется аргумент Int
и Strategy
. Так что же такое стратегия
и как ее создать? И как только я успешно использовал parListChunk,
Итак, Strategy
- это функция, которая принимает параметр типа Int и возвращает Done. По-видимому, это заставляет его аргумент оцениваться в определенное время или что-то в этом роде. Где я могу взять один и какой тип использовать?
Следующие функции возвращают стратегии:
sPar :: a -> Strategy b
sSeq :: a -> Strategy b
r0 :: Strategy a
rwhnf :: Strategy a
Но ни одна из них не позволяет вам определить параметр типа - они создают Стратегию
, когда вы указываете параметр a
, иначе вы не можете указать параметр a
! Что с этим ?? Кроме того, я понятия не имею, что они означают.
Я нашел один пример аналогичной функции parList, которая используется на SO:
return . maximum $ map optimize xs `using` parList
Она использует эту фанковую с использованием функции
, который объявлен:
using :: a -> Strategy a -> a
Достаточно справедливо ... в моем случае я, вероятно, хочу, чтобы a
было [Int]
, поэтому он принимает список Ints и Strategy
и (что-то делает ? применяет стратегию к списку? и) возвращает список Ints. Поэтому я попытался последовать примеру parList и изменил свой , в противном случае
охранник на:
| otherwise = results `using` parListChunk parChunkSize
, но я должен признать, что все еще снимаю в темноте ... Я не могу точно отслеживать типовые подписи вокруг. Так что неудивительно, что приведенное выше сообщение дает ошибку:
Couldn't match expected type `[(Int, Integer)]'
against inferred type `a -> Eval a'
Probable cause: `parListChunk' is applied to too few arguments
In the second argument of `using', namely
`parListChunk parChunkSize'
In the expression: results `using` parListChunk parChunkSize
Может ли кто-нибудь сказать мне, что использовать для аргумента Стратегии
для parListChunk? и как использовать Стратегию [a]
, возвращаемую parListChunk?
Новая часть
Глядя на Базовые стратегии , я думаю, что мне нужно использовать rseq
стратегия. Наверное.
В этих документах API говорится, что в пакете нет rseq, но похоже, что sSeq заменил его. Хорошо, я использовал sSeq, но он тоже "не входит в объем". Хотя я импортирую Control.Parallel.Strategies
.
Есть подсказки? Кстати, я получал эти сообщения о загрузке пакетов:
Loading package deepseq-1.1.0.0 ... linking ... done.
Loading package parallel-2.2.0.1 ... linking ... done.
Очевидно, это говорит о том, какая у меня версия параллельного пакета: 2.2.0.1. Но я не вижу информации в документации API о том, какая версия там описана. Если мне не следует использовать rseq или sSeq, что мне следует использовать? Как так получилось, что Эдвард смог использовать parList?