
Chris Kuklewicz wrote:
Aaron Denney wrote:
On 2006-04-08, Nils Anders Danielsson
wrote: On Fri, 07 Apr 2006, "Spencer Janssen"
wrote: inits xs = [] : (zipWith take [1..] $ map (const xs) xs)
As this version performs much better and will work as a drop in replacement, I suggest that it be included in the hierarchical libraries.
It is not a drop in replacement. The original inits is strict, this one isn't.
The specification of inits (from the Haskell 98 report):
inits :: [a] -> [[a]] inits [] = [[]] inits (x:xs) = [[]] ++ map (x:) (inits xs)
Is that a property many programs depend on? I'd actually call that a bug of the original.
It may break some things:
head (Data.List.inits undefined) is an error
head (New.Spiffy.inits undefined) is []
Is the head of the inits of undefined really an error? Since the head of inits [] is also [] ... But if you really want that undefined to produce an error.. you could just : inits' xn@(_:_) = zipWith take [0..] $ map (const xn) $ undefined:xn inits' _ = undefined