Если я перемещаю функцию из того места, где она используется, в отдельный модуль, я заметил, что производительность программы значительно падает.
calc = sum . nub . map third . filter isProd . concat . map parts . permutations
where third (_,_,b) = fromDigits b
isProd (a,b,p) = fromDigits a * fromDigits b == fromDigits p
-- All possibilities have digits: A x AAAA or AA x AAA
parts (a:b:c:d:e:rest) = [([a], [b,c,d,e], rest)
,([a,b], [c,d,e], rest)]
в другом модуле:
fromDigits :: Integral a => [a] -> a
fromDigits = foldl1' (\a b -> 10 * a + b)
Это выполняется за 0,1 секунды, когда fromDigits
находится в том же модуле, и за 0,4 секунды, когда я перемещаю его в другой модуль.
Я предполагаю, что это связано с тем, что GHC не может встроить функцию, если она находится в другом модуле, но мне кажется, это должнобыть в состоянии, поскольку они находятся в одном пакете.
Я не уверен, каковы настройки компилятора, но он собран с настройками Leksah/cabal по умолчанию. Я почти уверен, что это как минимум с -O2.