Почему списки в Хаскеле не выполняются параллельно?

Я выполняю задачу Project Euler 21 для домашней работы, и у меня есть понимание этого списка:

amicableNumberSums = [ x+y | x<-[1..10000], y <-[1..10000], (amicable x y)]

Это занимает очень много времени для выполнения (понятно, так как он проверяет 10000 ^ 2 пар чисел) и ищу при использовании моего процессора это показывает, что используется только 1 ядро.

Поскольку нет никаких побочных эффектов для понимания списка, нет опасности для нескольких пар чисел, которые тестируются одновременно. Есть ли способ заставить Haskell делать это автоматически или нет, как мой код мог быть изменен для этого?

(Правка) Ошибка при запуске print (amicableNumberSums using parList):

Couldn't match type `a0 -> Eval a0' with `[Int]'
Expected type: Strategy [Int]
  Actual type: Strategy a0 -> Strategy [a0]
In the second argument of `using', namely `parList'
In the first argument of `print', namely
  `(amicableNumberSums `using` parList)'
In the expression: print (amicableNumberSums `using` parList)

(Изменить) Выполнение двух предложенных методов:

Ørjan Johansen's method: 218.79s elapsed parallel (4 cores + 4 hyperthreading)
                         279.37s elapsed sequential (single core)
bheklilr's method: 247.82s elapsed parallel (4 cores + 4 hyperthreading)
                   274.10s elapsed sequential (single core)
Original method: 278.69s elapsed

Это не такое большое ускорение, как я надеялся, но теперь у меня есть правильный ответ на проблему, и пока я не научился еще немного Хаскелла, этого достаточно.

8
задан bradleyjkemp 10 September 2014 в 11:32
поделиться