RFC: general sequences

Ross Paterson ross at soi.city.ac.uk
Mon May 23 11:35:10 EDT 2005

On Mon, May 23, 2005 at 01:48:14PM +0100, Adrian Hey wrote:
> I'd like to know about the space behaviour of the folds and
> whether or not you need more fold variants.

Hmm, there are a number of choices just for foldr:

	foldr_l :: (a -> b -> b) -> b -> Seq a -> b
	foldr_l f z xs = case viewL xs of
		EmptyL -> z
		x :< xs' -> x `f` foldr_l f z xs'

	-- same result as foldr_l, but different performance
	foldr_r :: (a -> b -> b) -> b -> Seq a -> b
	foldr_r f z xs = case viewR xs of
		EmptyR -> z
		xs' :> x -> foldr_r f (x `f` z) xs'

	-- strict version
	foldr_r' :: (a -> b -> b) -> b -> Seq a -> b
	foldr_r' f z xs = case viewR xs of
		EmptyR -> z
		xs' :> x -> let z' = x `f` z in z' `seq` foldr_r' f z' xs'

The current definition is equivalent to the first (but operates directly
on the internal structure).  I can't think of a situation where I'd want
the second.  The strict version would be useful, and probably a monadic
version too (of which strictness could be a special case).

More information about the Libraries mailing list