LINUX.ORG.RU

История изменений

Исправление 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.