нуль вместо == - PullRequest
       19

нуль вместо ==

34 голосов
/ 04 октября 2010

Я только начал изучать Хаскелл из интереса. Я следую learnyouahaskell.com .

Там я нашел это:

null проверяет, является ли список пустым. Если оно это возвращает True, в противном случае это возвращает False. Используйте эту функцию вместо xs == [] (если у вас есть список называется xs)

Почему это? Почему мы должны использовать null вместо ==, когда оба дают одинаковый результат?

Спасибо.

Ответы [ 3 ]

68 голосов
/ 04 октября 2010

Для сравнения списков с == требуется сопоставимость элементов (обозначается как 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).
11 голосов
/ 04 октября 2010

По моему мнению, null myList читается более естественно, чем myList == [].

Но raison d'être для null заключается в том, что его можно использовать как функцию.Например, вот функция, которая принимает список списков и возвращает только непустые:

nonemptyLists :: [[a]] -> [[a]]
nonemptyLists = filter (not . null)

Без null это будет более неудобно:

nonEmptyLists = filter ([] /=)
6 голосов
/ 04 октября 2010

Другое преимущество использования null состоит в том, что многие другие контейнеры (например, Data.Sequence, Data.ByteString и т. Д.) Также имеют функцию null.Это позволяет легко переключаться на другую реализацию, просто изменяя операторы импорта.

...