views:

127

answers:

1

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.

+12  A: 

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.

Dario
x:xs yeah that's the way the thing was used in OzML (what I meant by left or right). I am really pleased with this way of writing. thx for the answer.
Stephane Rolland