Я решил проблему Project Euler, а затем столкнулся с моим решением с той, что была на вики Haskell. Они были довольно похожи, но у меня было 7,5 секунды, а у остальных 0,6! Я скомпилировал их оба.
Моя выглядит следующим образом:
main = print . maximumBy (compare `on` cycleLength) $ [1..999]
where cycleLength d = remainders d 10 []
и один из вики:
main = print . fst $ maximumBy (comparing snd) [(n, cycleLength n) | n <- [1..999]]
where cycleLength d = remainders d 10 []
Я также попытался изменить compare `on`
на comparing cycleLength
, но производительность осталась прежней.
Поэтому я должен заключить, что вся разница заключается в вычислении значений "на лету" против выполнения преобразования в понимании списка.
Разница во времени довольно огромная: вторая версия имеет 12,5-кратное ускорение!