문제

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.

도움이 되었습니까?

해결책

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top