The problem -- like so many others when you're learning Haskell -- is one of typing. Type the following into GHCi
:t mylast
and you'll see that the type signature is
mylast :: [[a]] -> [a]
which expects a list of lists and will return a list. So if you put in a list of strings ["bob", "fence", "house"] the function will work as you've written it.
The problem is your base case: mylast [] = [], which tells the compiler that you want to return a list. You want to return an element, not a list. But there is no empty element in Haskell (very much by design), so you need to use the Maybe monad.
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (x:xs) = mylast xs
Monads are a somewhat abstract topic, but you need the Maybe monad when you're starting out. All you need to know about it is it's a type declaration that tells the compiler to expect two possibilities: "Nothing," or "Just x". The returning code can then take x and run with it, but if you leave off the "Just," the compiler will complain.
The alternative is to throw an error when an empty list is encountered, like so:
mynextlast [] = error "no empty lists allowed"
mynextlast (x:[]) = x
mynextlast (x:xs) = mynextlast xs
But my suspicion is that Maybe is the way to go.