[Haskell-cafe] Thompson's Exercise 9.13

Daniel Fischer daniel.is.fischer at web.de
Sun Apr 10 05:18:48 EDT 2005


Am Sonntag, 10. April 2005 08:44 schrieb Kaoru Hosokawa:
> 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)

Try 

left :: (Bool, [a]) -> (Bool, [a]),

res :: (Bool, [a]) -> [a],

init' = res . foldr left (False, [])

for example. It's not too difficult then.

>
> 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.
>
I cannot imagine how you could do it for Strings, but not for general lists.
Mind sending me the code?

Hope this helps,

Daniel



More information about the Haskell-Cafe mailing list