From: naur@post11.tele.dk Date: Sat, 7 Feb 2009 18:14:27 +0000 (+0000) Subject: Rules to make genericLength strict for Int/Integer lengths, see #2962 X-Git-Tag: 2009-06-25~56 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=349544274787b6d587e85e75e6c754a618b813aa;p=ghc-base.git Rules to make genericLength strict for Int/Integer lengths, see #2962 --- diff --git a/Data/List.hs b/Data/List.hs index 16cbeb8..bd4e14c 100644 --- a/Data/List.hs +++ b/Data/List.hs @@ -568,6 +568,17 @@ genericLength :: (Num i) => [b] -> i genericLength [] = 0 genericLength (_:l) = 1 + genericLength l +{-# RULES + "genericLengthInt" genericLength = (strictGenericLength :: [a] -> Int); + "genericLengthInteger" genericLength = (strictGenericLength :: [a] -> Integer); + #-} + +strictGenericLength :: (Num i) => [b] -> i +strictGenericLength l = gl l 0 + where + gl [] a = a + gl (_:xs) a = let a' = a + 1 in a' `seq` gl xs a' + -- | The 'genericTake' function is an overloaded version of 'take', which -- accepts any 'Integral' value as the number of elements to take. genericTake :: (Integral i) => i -> [a] -> [a]