That is odd that the second one does not complain about non-exhaustive
patterns, since third2 will not match lists of length zero, one, or two.
The third and third3 functions complain because [a] is not a variable,
it is a pattern. [a] desugars to (a:[]), so you could have written them as
third (a:[]) = head (tail (a:[]))
third3 (a:[]) = (a:[]) !! 2
Neither of which will work, as those are single element lists.
I suspect what you want is
third a = head (tail a)
third3 a = a !! 2