Less strict inits and tails
authorIan Lynagh <igloo@earth.li>
Sun, 3 Apr 2011 16:08:46 +0000 (17:08 +0100)
committerIan Lynagh <igloo@earth.li>
Sun, 3 Apr 2011 17:18:03 +0000 (18:18 +0100)
Converted from darcs patches from Bas van Dijk <v.dijk.bas@gmail.com>

Previously: tails _|_ = _|_
Now:        tails _|_ = _|_ : _|_

Previously: inits _|_ = _|_
Now:        inits _|_ = [] : _|_

Data/List.hs

index 061ad42..bb71da5 100644 (file)
@@ -744,19 +744,24 @@ groupBy eq (x:xs)       =  (x:ys) : groupBy eq zs
 --
 -- > inits "abc" == ["","a","ab","abc"]
 --
+-- Note that 'inits' has the following strictness property:
+-- @inits _|_ = [] : _|_@
 inits                   :: [a] -> [[a]]
-inits []                =  [[]]
-inits (x:xs)            =  [[]] ++ map (x:) (inits xs)
+inits xs                =  [] : case xs of
+                                  []      -> []
+                                  x : xs' -> map (x :) (inits xs')
 
 -- | The 'tails' function returns all final segments of the argument,
 -- longest first.  For example,
 --
 -- > tails "abc" == ["abc", "bc", "c",""]
 --
+-- Note that 'tails' has the following strictness property:
+-- @tails _|_ = _|_ : _|_@
 tails                   :: [a] -> [[a]]
-tails []                =  [[]]
-tails xxs@(_:xs)        =  xxs : tails xs
-
+tails xs                =  xs : case xs of
+                                  []      -> []
+                                  _ : xs' -> tails xs'
 
 -- | The 'subsequences' function returns the list of all subsequences of the argument.
 --