Commit cee33699 authored by simonpj@microsoft's avatar simonpj@microsoft
Browse files

Make length a good consumer

Make length into a good consumer.  Fixes Trac bug #707.

(Before length simply didn't use foldr.)
parent f61e5912
......@@ -111,21 +111,12 @@ null (_:_) = False
-- | 'length' returns the length of a finite list as an 'Int'.
-- It is an instance of the more general 'Data.List.genericLength',
-- the result type of which may be any kind of number.
length :: [a] -> Int
length l = lenAcc 0# l
{-# RULES
"length" [~1] forall xs. length xs = foldr incL (I# 0#) xs
"lenAcc" [1] forall n#. foldr incL (I# n#) = lenAcc n#
#-}
incL :: a -> Int -> Int -- Internal
{-# NOINLINE [0] incL #-}
incL x n = n `plusInt` oneInt
lenAcc :: Int# -> [a] -> Int -- Internal
lenAcc a# [] = I# a#
lenAcc a# (_:xs) = lenAcc (a# +# 1#) xs
length :: [a] -> Int
length l = len l 0#
where
len :: [a] -> Int# -> Int
len [] a# = I# a#
len (_:xs) a# = len xs (a# +# 1#)
-- | 'filter', applied to a predicate and a list, returns the list of
-- those elements that satisfy the predicate; i.e.,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment