on master help sign in
Make the sum fold numerically stable
c2acb45Adithya Kumar
core/src/Streamly/Internal/Data/Fold.hs+9−2
@@ -313,6 +313,7 @@ import qualified Data.Set as Set
313import qualified Prelude
313import qualified Prelude
314import qualified Streamly.Internal.Data.Array.Foreign.Mut.Type as MA
314import qualified Streamly.Internal.Data.Array.Foreign.Mut.Type as MA
315import qualified Streamly.Internal.Data.Array.Foreign.Type as Array
315import qualified Streamly.Internal.Data.Array.Foreign.Type as Array
316+import qualified Streamly.Internal.Data.Fold.Window as FoldW
316import qualified Streamly.Internal.Data.IsMap as IsMap
317import qualified Streamly.Internal.Data.IsMap as IsMap
317import qualified Streamly.Internal.Data.Pipe.Type as Pipe
318import qualified Streamly.Internal.Data.Pipe.Type as Pipe
318import qualified Streamly.Internal.Data.Ring.Foreign as Ring
319import qualified Streamly.Internal.Data.Ring.Foreign as Ring
@@ -336,6 +337,7 @@ import Streamly.Internal.Data.Fold.Type
336-- >>> import qualified Streamly.Data.Fold as Fold
337-- >>> import qualified Streamly.Data.Fold as Fold
337-- >>> import qualified Streamly.Internal.Data.Fold as Fold
338-- >>> import qualified Streamly.Internal.Data.Fold as Fold
338-- >>> import qualified Streamly.Internal.Data.Fold.Type as Fold
339-- >>> import qualified Streamly.Internal.Data.Fold.Type as Fold
340+-- >>> import qualified Streamly.Internal.Data.Fold.Window as FoldW
339-- >>> import qualified Streamly.Data.Array.Foreign as Array
341-- >>> import qualified Streamly.Data.Array.Foreign as Array
340-- >>> import qualified Streamly.Internal.Data.Parser as Parser
342-- >>> import qualified Streamly.Internal.Data.Parser as Parser
341-- >>> import Streamly.Internal.Data.Stream.Serial (SerialT(..))
343-- >>> import Streamly.Internal.Data.Stream.Serial (SerialT(..))
@@ -681,12 +683,17 @@ countDistinctInt = fmap (\(Tuple' _ n) -> n) $ foldl' step initial
681-- identity (@0@) when the stream is empty. Note that this is not numerically
683-- identity (@0@) when the stream is empty. Note that this is not numerically
682-- stable for floating point numbers.
684-- stable for floating point numbers.
683--
685--
686+-- >>> sum = FoldW.cumulative FoldW.sum
687+--
688+-- Same as following but numerically stable:
689+--
690+-- >>> sum = Fold.foldl' (+) 0
684−-- > sum = fmap getSum $ Fold.foldMap Sum
691+-- >>> sum = fmap Data.Monoid.getSum $ Fold.foldMap Data.Monoid.Sum
685--
692--
686-- @since 0.7.0
693-- @since 0.7.0
687{-# INLINE sum #-}
694{-# INLINE sum #-}
688sum :: (Monad m, Num a) => Fold m a a
695sum :: (Monad m, Num a) => Fold m a a
689−sum = foldl' (+) 0
696+sum = FoldW.cumulative FoldW.sum
690
697
691-- | Determine the product of all elements of a stream of numbers. Returns
698-- | Determine the product of all elements of a stream of numbers. Returns
692-- multiplicative identity (@1@) when the stream is empty. The fold terminates
699-- multiplicative identity (@1@) when the stream is empty. The fold terminates
core/src/Streamly/Internal/Data/Fold/Window.hs+1−1
@@ -61,7 +61,7 @@ import Streamly.Internal.Data.Tuple.Strict
61
61
62import Prelude hiding (length, sum, minimum, maximum)
62import Prelude hiding (length, sum, minimum, maximum)
63
63
64−import qualified Streamly.Data.Fold as Fold
64+import qualified Streamly.Internal.Data.Fold.Type as Fold
65import qualified Streamly.Internal.Data.Ring.Foreign as Ring
65import qualified Streamly.Internal.Data.Ring.Foreign as Ring
66
66
67-- $setup
67-- $setup