Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

head and tail calls on empty list bringing an exception

I'm following a tutorial. (Real World Haskell)

And I have one beginner question about head and tail called on empty lists: In GHCi it returns exception.

Intuitively I think I would say they both should return an empty list. Could you correct me ? Why not ? (as far as I remember in OzML left or right of an empty list returns nil)

I surely have not yet covered this topic in the tutorial, but isnt it a source of bugs (if providing no arguments)? I mean if ever passing to a function a list of arguments which may be optionnal, reading them with head may lead to a bug ?

I just know the GHCi behaviour, I don't know what happens when compiled.

like image 834
Stephane Rolland Avatar asked Dec 13 '25 04:12

Stephane Rolland


1 Answers

Intuitively I think would say they both should return an empty list. Could you correct me ? Why not ?

Well - head is [a] -> a. It returns the single, first element; no list.

And when there is no first element like in an empty list? Well what to return? You can't create a value of type a from nothing, so all that remains is undefined - an error.


And tail? Tail basically is a list without its first element - i.e. one item shorter than the original one. You can't uphold these laws when there is no first element.

When you take one apple out of a box, you can't have the same box (what happened when tail [] == []). The behaviour has to be undefined too.


This leads to the following conclusion:

I surely have not yet covered this topic in the tutorial, but isnt it a source of bugs ? I mean if ever passing to a function a list of arguments which may be optionnal, reading them with head may lead to a bug ?

Yes, it is a source of bugs, but because it allows to write flawed code. Code that's basically trying to read a value that doesn't exist. So: *Don't ever use head/tail** - Use pattern matching.

sum     [] = 0
sum (x:xs) = x + sum xs

The compiler can guarantee that all possible cases are covered, values are always defined and it's much cleaner to read.

like image 60
Dario Avatar answered Dec 15 '25 06:12

Dario



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!