Проблема, как выяснилось, в том, что foldl держит в памяти невычисленным весь список пока не дойдет до его конца, оптимизируя для скорости, и жрет память пока она не кончится, при этом тормозя. В случае с таким большим списком следует использовать оптимизирующий для памяти foldl'.
@voker57 хули там иметь
import Criterion.Main
main = defaultMain [
bgroup "sumvsfold" [ bench "sum" $ whnf (\x -> sum [1..x]) 1000000, bench "foldl" $ whnf (\x -> foldl (+) 0 [1..x]) 1000000 ]
]
benchmarking sumvsfold/sum
time 21.46 ms (21.00 ms .. 21.99 ms)
0.997 R² (0.994 R² .. 0.999 R²)
mean 21.74 ms (21.38 ms .. 22.33 ms)
std dev 1.056 ms (727.1 μs .. 1.643 ms)
variance introduced by outliers: 19% (moderately inflated)
benchmarking sumvsfold/foldl
time 28.04 ms (23.36 ms .. 33.76 ms)
0.913 R² (0.865 R² .. 0.993 R²)
mean 23.64 ms (22.48 ms .. 25.88 ms)
std dev 3.650 ms (1.553 ms .. 5.915 ms)
variance introduced by outliers: 67% (severely inflated)
Подозреваю, что потому что в `sum` сидит `foldl`, а не `foldl'`. Первый не нужен почти никогда (хотя где-то видел извращенцев, которым он был нужен, но я так и не понял зачем).