Как использовать параллельные стратегии в Haskell

У меня есть функция frequencyBy , которую я хотел бы распараллелить. Вот простой тестовый пример:

import Control.Parallel.Strategies
import Control.DeepSeq
import System.Environment

frequencyBy :: (a -> b -> Bool) -> [a] -> [b] -> [(a,Int)]
frequencyBy f as bs = map 
    (\a ->(a, foldr (\b -> if f a b then (+) 1 else id) 0 bs)) as

main :: IO ()
main = do
  x:xs <- getArgs
  let result = frequencyBy (==) [1::Int .. 10000] [1 .. (read x)] `using` 
                 parList rdeepseq
  print $ product $ map snd $ result

Я хотел бы запустить ] map в frequencyBy параллельно. Я пытаюсь добиться этого, используя parList rdeepseq (все остальное в main просто для того, чтобы все оптимизировано). Однако это не работает, два потока выполняют в два раза больше работы, чем один поток за одно и то же время. Я не понимаю, что я здесь делаю не так.

9
задан user362382 13 January 2012 в 14:42
поделиться