From 961f71b9717dcdbde9822018c2901aec90eb04f4 Mon Sep 17 00:00:00 2001 From: Moritz Kiefer Date: Fri, 14 Oct 2016 22:06:44 +0200 Subject: [PATCH] Export strict versions of sum and product --- CHANGES.md | 5 +++++ src/List.hs | 13 ++++++++++++- src/Protolude.hs | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index d7ddcff9d..8d116dba1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,8 @@ +0.1.9 +==== + +* Make `sum` and `product` strict + 0.1.8 ===== diff --git a/src/List.hs b/src/List.hs index 6d1261ec8..66b325248 100644 --- a/src/List.hs +++ b/src/List.hs @@ -6,16 +6,19 @@ module List ( ordNub, sortOn, list, + product, + sum ) where import Data.List (sortBy) import Data.Maybe (Maybe(..)) import Data.Ord (Ord, comparing) -import Data.Foldable (Foldable, foldr) +import Data.Foldable (Foldable, foldr, foldl') import Data.Function ((.)) import Data.Functor (fmap) import Control.Monad (return) import qualified Data.Set as Set +import GHC.Num (Num, (+)) head :: (Foldable f) => f a -> Maybe a head = foldr (\x _ -> return x) Nothing @@ -37,3 +40,11 @@ list :: [b] -> (a -> b) -> [a] -> [b] list def f xs = case xs of [] -> def _ -> fmap f xs + +{-# INLINE product #-} +product :: (Foldable f, Num a) => f a -> a +product = foldl' (+) 1 + +{-# INLINE sum #-} +sum :: (Foldable f, Num a) => f a -> a +sum = foldl' (+) 0 diff --git a/src/Protolude.hs b/src/Protolude.hs index 371aea749..fd74c5f53 100644 --- a/src/Protolude.hs +++ b/src/Protolude.hs @@ -95,6 +95,8 @@ import Data.Traversable as X import Data.Foldable as X hiding ( foldr1 , foldl1 + , product + , sum ) import Semiring as X import Data.Functor.Identity as X