tags:

views:

142

answers:

1

Hi, I have a problem with a function that should only return the tail of a list. The functions is myTail and should give a useable result, even if the input is an empty list.

I want to understand all 3 ways: pattern matching, guarded equation and conditional expressions

this works:

>myTail_pat :: [a] -> [a]

>myTail_pat (x:xs) = xs
>myTail_pat [] = []

But this:

>myTail_guard (x:xs)    | null xs = []
>      | otherwise = xs

gives me the error: Program error: pattern match failure: myTail_guard [] How can i declare the function without patterns?

Thank you.

+7  A: 

The pattern x:xs does not match the empty list. You'd need to do:

myTail_guard xs
  | null xs   = []
  | otherwise = tail xs
Chuck
If you want to avoid `tail xs` I think you could replace it with `xss where (_, xss) = xs`
Artelius
@Artelius: that should be `xss where (_:xss) = xs`.
Porges