[Haskell-cafe] Newbie question

Terry Phelps tgphelps50 at gmail.com
Sat Jan 15 14:32:27 UTC 2022


I'm trying yet again to "get" Haskell. I'm reading Graham Hutton's book
"Programming in Haskell", and am working on one of the exercises. Sounds
easy enough:

Make a function 'last' that returns the last element of a non-empty list.

After struggling a while, I looked at the answer: last = head . reverse.
I wish I had thought of that. But I kept trying to get my recursive version
done, but I can't seem to make ghci happy. (Version 8.10.5, if you care). I
wrote:

last [] = []
(Yes, I know that's not a non-empty list, but I don't want ghci whining
about non-exhaustive patterns). Then I added:

last [x] = x
And I checked the type:
:t last
last:: [a] -> [a]

Yes, that looks right. There seems to be only one other case: 2 or more
elements. So I wrote:

last (x:y:xs) = last (y:xs)

I ran it:

Prelude> last [1,2]
*** Exception: <interactive>:2:1-27: Non-exhaustive patterns in function
last

What the heck is the problem? I've covered every possible list, haven't I?

Stranger yet, I check the type again:

Prelude> :t last
last :: [a] -> t

The type has changed. And I don't understand what it means. What's the 't'?

I'm sure this is a simple beginner error, but I'm really confused. I don't
see how it isn't exhaustive, and I don't see why the 3rd clause (or
whatever it's called) caused the type to change.

Someone help, please.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20220115/d08f1f78/attachment.html>


More information about the Haskell-Cafe mailing list