[Haskell-cafe] Computing lazy and strict list operations at the same time

Jon Fairbairn jon.fairbairn at cl.cam.ac.uk
Mon Jun 19 12:03:35 EDT 2006


On 2006-06-19 at 15:24-0000 "C Rodrigues" wrote:
> Here's a puzzle I haven't been able to solve.  Is it possible to write the 
> initlast function?
> 
> There are functions "init" and "last" that take constant stack space and 
> traverse the list at most once.  You can think of traversing the list as 
> deconstructing all the (:) [] constructors in list.
> 
> init (x:xs) = init' x xs
>   where init' x (y:ys) = x:init' y ys
>         init' _ [] = []
> 
> last (x:xs) = last' x xs
>   where last' _ (y:ys) = last' y ys
>         last' x [] = x
> 
> Now, is there a way to write initlast :: [a] -> ([a], a) that returns the 
> result of init and the result of last, takes constant stack space, and 
> traverses the list only once?  Calling reverse traverses the list again.  I 
> couldn't think of a way to do it, but I couldn't figure out why it would be 
> impossible.


il [] = error "foo"
il [x] = ([], x)
il (x:xs) = cof x (il xs)
            where cof x ~(a,b) = (x:a, b)
--                      !


Should do it, I think.

-- 
Jón Fairbairn                              Jon.Fairbairn at cl.cam.ac.uk




More information about the Haskell-Cafe mailing list