ghcのデフォルトsum
は、foldl'
(stricter equivalentはfoldl
)よりも10倍遅いですか?その場合、なぜfoldl'
を使用して実装されていないのですか?完全のためになぜhaskellのfoldlより和が遅いのですか?
import Data.List
> foldl' (+) 0 [1..10^7]
50000005000000
(0.39 secs, 963,528,816 bytes)
> sum [1..10^7]
50000005000000
(4.13 secs, 1,695,569,176 bytes)
ここもfoldl
とfoldr
の統計情報です。
> foldl (+) 0 [1..10^7]
50000005000000
(4.02 secs, 1,695,828,752 bytes)
> foldr (+) 0 [1..10^7]
50000005000000
(3.78 secs, 1,698,386,648 bytes)
彼らのランタイムが似ているので、sum
がfoldl
を使用して実装されているように見えます。 ghc 7.10.2でテストされています。 in the sourceを見ることができるように
-- | The 'sum' function computes the sum of a finite list of numbers.
sum :: (Num a) => [a] -> a
{-# INLINE sum #-}
sum = foldl (+) 0
:
-O2でコンパイルすると同じです。 –
@JoachimBreitner申し訳ございません – Carsten
もご覧ください:https://www.reddit.com/r/haskell/comments/2agxcb/why_is_sum_lazy/ – ZhekaKozlov