I am reading through the "Starting Out" chapter of Learn You a Haskell for Great Good!. It says:
nullchecks 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 Ints.
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