Для сравнения списков с ==
требуется сопоставимость элементов (обозначается как Eq a
).
Prelude> :t (==[])
(==[]) :: (Eq a) => [a] -> Bool
Например, [sin] == []
не будет работать, так как вы не можете сравнивать функции. Это может показаться глупым, но система типов должна судить о типе выражения, не глядя на его значение.
Альтернативная проверка будет length xs == 0
, это не требует равенства, но не остановится, если ваш список бесконечен (попробуйте length [1..] == 0
). Вот почему есть специальная функция.
null [] = True
null _ = False
Prelude> :t null
null :: [a] -> Bool -- Notice lack of (Eq a).