Hamilton Richards ham at cs.utexas.edu
Tue Apr 12 12:26:34 EDT 2005

```Here's a solution:

>   init :: [a] -> [a]
>   init xs = tail (foldr keep [] xs)
>     where
>     keep :: a -> [a] -> [a]
>     keep x []  = [x]
>     keep x [y] = [x,x]
>     keep x (y:z:zs)  = x:x:y:zs

--Ham

At 3:44 PM +0900 2005/4/10, Kaoru Hosokawa wrote:
>I've been working through Thompson's exercises and got to one I
>could not solve. It's Exercise 9.13. This is where I need to define
>init using foldr.
>
>	init :: [a] -> [a]
>	init "Greggery Peccary" ~> "Greggary Peccar"
>
>This is as far as I got:
>
>	init xs = foldr left [] xs
>
>	left :: a -> [a] -> [a]
>	left x []	= []
>	left x1 : (x2 : xs) = x1 : (left x2 xs)
>
>But this returns [] and doesn't work. I can't get "left" to know
>that it is working with the rightmost element. It just throws away
>every element when its right hand side is empty.
>
>I found a solution that works for Strings, but I am looking for a
>more general solution. This exercise may yet again be one of those
>that is difficult to solve with my current knowledge of Haskell, but
>
>--
>Kaoru Hosokawa
>khosokawa at gmail.com
>
>_______________________________________________

--
------------------------------------------------------------------
Hamilton Richards, PhD           Department of Computer Sciences
Senior Lecturer                  The University of Texas at Austin
512-471-9525                     1 University Station C0500
Taylor Hall 5.138                Austin, Texas 78712-0233
ham at cs.utexas.edu                hrichrds at swbell.net
http://www.cs.utexas.edu/users/ham/richards
------------------------------------------------------------------
```