take 10 . sort has optimized asymptotic time
take k of a lazily produced list
Ed Kmett’s memo table
General argument that they are better than fingertrees in some situations
zip [1..] (...)
zip (cycle [True, False]) and
take n (cycle xs)
The alternative is just to make lists spine strict, but that makes guarded recursion fly out the window, the following for example will run much slower, and take asymptotically more (O(n) vs O(1)) stack space:
fmap f (x : xs) = f x : fmap f xs fmap _  = 
traverse and basically any function that builds a list will similarly suffer, e.g toList, many, some etc.
(Ah, but this can be fixed by “tail recursion modulo cons”, as is done in OCaml).
mapM XXX . fliter YYY . [AAA...BBB] is meant to be running at constant space, and strict list will simply blow the heap.
Something to do with Alternative
Cyclic data structures
any :: (a -> Bool) -> [a] -> Bool any p = or . map p