id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	os	architecture	failure	difficulty	testcase	blockedby	blocking	related
5083	Proposal: making inits and tails less strict	basvandijk		"I would like to propose making `inits` and `tails` less strict:

{{{
 inits                   :: [a] -> [[a]]
-inits []                =  [[]]
-inits (x:xs)            =  [[]] ++ map (x:) (inits xs)

+inits xs                =  [] : case xs of
+                                  []   -> []
+                                  x:xs -> map (x:) (inits xs)
}}}

{{{
 tails                   :: [a] -> [[a]]
-tails []                =  [[]]
-tails xxs@(_:xs)        =  xxs : tails xs

+tails xxs               =  xxs : case xxs of
+                                   []   -> []
+                                   _:xs -> tails xs
}}}
Having a lazier `inits` allows the elegant:
{{{nats = map length (inits nats)}}}
which loops for the current definition. This definition was [http://www.mail-archive.com/haskell@haskell.org/msg21044.html due to John Tromp]

In the [http://thread.gmane.org/gmane.comp.lang.haskell.libraries/15459/ thread on the libraries list] there were some +1's and no objections."	task	closed	normal		libraries/base	7.0.3	fixed			Unknown/Multiple	Unknown/Multiple	None/Unknown					
