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 I'm asking anyway.

--
Kaoru Hosokawa
[EMAIL PROTECTED]

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


--
------------------------------------------------------------------
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
[EMAIL PROTECTED]                [EMAIL PROTECTED]
http://www.cs.utexas.edu/users/ham/richards
------------------------------------------------------------------
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to