[Haskell-beginners] defining 'init' in terms of 'foldr'
Hein Hundal
hundalhh at yahoo.com
Sun Dec 5 12:37:12 CET 2010
> From: Daniel Fischer <daniel.is.fischer at googlemail.com>
> Subject: Re: [Haskell-beginners] defining 'init' in terms
> of 'foldr'
> On Saturday 04 December 2010 23:20:51, Paul Higham wrote:
> > Not sure if this thread is still active but I also
> > struggled with this
> > same exercise. I offer the following solution as
> > a thing to shoot at:
> >
> > myInit :: [a] -> [a]
> > myInit ys = foldr snoc [] $ (\(x:xs) -> xs) $ foldr snoc [] ys
> > where snoc = (\x xs -> xs ++ [x])
>
> init === reverse . tail . reverse
> only holds for finite lists, for infinite lists xs, reverse
> xs = _|_, but
> init xs = xs.
> Also, it's inefficient, but that's not the point of the
> exercise.
Here is my incomplete beginner solution:
--Start Code
import Data.Maybe
myinit v = fromJust $ foldr f Nothing v
where
f a Nothing = Just []
f a (Just v) = Just (a:v)
--End Code
This worked for the finite lists that I tried, but it did not work for infinite lists. I was surprised that foldr works with infinite lists. If I set
v = take 5 $ foldr (\x xs -> (x*x):xs) [] [1..]
then the value of v is [1,2,9,16]. Is there another way to create the init function with foldr that works for infinite lists?
Hein
More information about the Beginners
mailing list