История изменений
Исправление quasimoto, (текущая версия) :
С таким вариантом
main = print $ sumAll [1 .. 1000000000]
после компиляции с любыми оптимизациями при запуске съест всю кучу.
Вот так
{-# LANGUAGE BangPatterns #-}
sum' :: Num a => [a] -> a
sum' = go 0 where
go a [] = a
go !a (x:xs) = go (a + x) xs
или так
import Data.List
sum' :: Num a => [a] -> a
sum' = foldl' (+) 0
будет работать хорошо всегда (от -O0 включительно).
Если без BangPatterns и s/!a/a/ или s/foldl'/foldl/ или s/sum'/sum/ (стандартный sum) — всегда хорошо кроме -O0.
Исправление quasimoto, :
С таким вариантом
main = print $ sumAll [1 .. 1000000000]
после компиляции с любыми оптимизациями при запуске съест всю кучу.
Вот так
{-# LANGUAGE BangPatterns #-}
module Main where
sum' :: Num a => [a] -> a
sum' = go 0 where
go a [] = a
go !a (x:xs) = go (a + x) xs
или так
module Main where
import Data.List
sum' :: Num a => [a] -> a
sum' = foldl' (+) 0
будет работать хорошо всегда (от -O0 включительно).
Если без BangPatterns и s/!a/a/ или s/foldl'/foldl/ или s/sum'/sum/ (стандартный sum) — всегда хорошо кроме -O0.
Исходная версия quasimoto, :
С таким вариантом
main = print $ sumAll [1 .. 1000000000]
после компиляции с любыми оптимизациями при запуске съест всю кучу.
Вот так
{-# LANGUAGE BangPatterns #-}
module Main where
sum' :: Num a => [a] -> a
sum' = go 0 where
go a [] = a
go !a (x:xs) = go (a + x) xs
или так
module Main where
import Data.List
sum' :: Num a => [a] -> a
sum' = foldl' (+) 0
будет работать хорошо всегда (от -O0).
Если без BangPatterns и s/!a/a/ или s/foldl'/foldl/ или s/sum'/sum/ (стандартный sum) — всегда хорошо кроме -O0.