Haskell - простой способ кэшировать вызов функции

У меня есть такие функции, как :

millionsOfCombinations = [[a, b, c, d] | 
  a <- filter (...some filter...) someListOfAs, 
  b <- (...some other filter...) someListOfBs, 
  c <- someListOfCs, d <- someListOfDs]

aLotOfCombinationsOfCombinations = [[comb1, comb2, comb3] | 
  comb1 <- millionsOfCombinations, 
  comb2 <- millionsOfCombinations,
  comb3 <- someList,
  ...around 10 function calls to find if
    [comb1, comb2, comb3] is actually useful]

Оценка миллионов комбинаций занимает 40 секунд. на очень быстрой рабочей станции. Оценка aLotOfCombinationsOfCombinations !! 0 заняла 2 дня: - (

Как я могу ускорить этот код? Пока у меня было 2 идеи - использовать профилировщик. Пробовал запустить myapp + RTS - sstderr после компиляции с GHC, но получаю пустой экран и не хочу ждать несколько дней, пока он закончится.

Вторая мысль заключалась в том, чтобы каким-то образом кэшировать миллионы комбинаций . Правильно ли я понимаю, что для каждое значение в aLotOfCombinationsOfCombinations , illionOfCombinations оценивается несколько раз? Если это так, как я могу кэшировать результат? Очевидно, я только начал изучать Haskell. выполнять кэширование вызовов с помощью монады, но я все еще не понимаю этих вещей.

9
задан fuz 10 August 2011 в 20:21
поделиться