null instead of ==

bdhar picture bdhar · Oct 4, 2010 · Viewed 13.9k times · Source

I have just started to learn Haskell out of interest. I follow learnyouahaskell.com.

There I found this:

null checks if a list is empty. If it is, it returns True, otherwise it returns False. Use this function instead of xs == [] (if you have a list called xs)

Why is that? Why should we use null instead of == when both produce the same result?

Thanks.

Answer

sdcvvc picture sdcvvc · Oct 4, 2010

Comparing the lists with == requires elements to be comparable (denoted as Eq a).

Prelude> :t (==[])
(==[]) :: (Eq a) => [a] -> Bool

For example, [sin] == [] won't work, since you can't compare functions. It might seem stupid, but the type system must judge type of an expression without looking at its value.

An alternate check would be length xs == 0, this doesn't require equality but won't stop if your list is infinite (try length [1..] == 0). That's why there's a dedicated function.

null [] = True
null _ = False

Prelude> :t null
null :: [a] -> Bool     -- Notice lack of (Eq a).