Как создать стратегию в Haskell Control.Parallel. Стратегии?

Обновление : я только что нашел эту страницу документации . Хотелось бы, чтобы на него была ссылка из документации, которую я использовал , которая казалась окончательной документацией 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?

11
задан Community 23 May 2017 в 10:30
поделиться