I am reading through the "Starting Out" chapter of Learn You a Haskell for Great Good!. It says:
null
checks if a list is empty. If it is, it returnsTrue
, otherwise it returnsFalse
. Use this function instead ofxs == []
(if you have a list calledxs
)
I tried in ghci:
xs = [] -- and then, xs == [] null xs
Both of them are True
.
I wonder what's the difference.
Should I use the null
function instead of == []
and why?
Get Programming with HaskellYou can't return an empty list, because an empty list is the same type as the elements of the list.
You can just use == on them directly. This means that lists instantiate Eq as long as the element type also instantiates Eq , which is the case for all types defined in the standard Prelude except functions and IO actions.
You should use null
. In most cases it doesn't matter, but it is a good habit to get into anyway, because occasionally you may want to check if a list of non-comparable things is empty. Here is a short, crisp example showing this difference:
> null [id] False > [id] == [] <interactive>:1:1: error: • No instance for (Eq (a0 -> a0)) arising from a use of ‘==’ (maybe you haven't applied a function to enough arguments?) • In the expression: [id] == [] In an equation for ‘it’: it = [id] == []
There is a difference. In order to use x == []
, the type of the elements of the list should be a member of the Eq
typeclass. Indeed, checking the equality of two lists is defined by the instance declaration:
instance Eq a => Eq [a] where [] == [] = True (x:xs) == (y:ys) = x == y && xs == ys _ == _ = False
That means that you can not use x == []
if x
is for example a list of IO Int
s.
null :: [a] -> Bool
on the other hand, uses pattern matching. This is implemented as:
null :: [a] -> Bool null [] = True null (_:_) = False
So regardless what type the elements of the list are, it will always typecheck.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With