2010-10-04 24 views
33

Właśnie zacząłem uczyć się Haskella w interesie. Postępuję zgodnie z learnyouahaskell.com.null zamiast ==

Nie znalazłem to:

null sprawdza, czy lista jest pusta. Jeśli jest to , zwraca True, w przeciwnym razie zwraca False. Użyj tej funkcji zamiast xs == [] (jeśli masz listy o nazwie xs)

dlaczego tak jest? Dlaczego powinniśmy używać null zamiast ==, gdy oba dają taki sam wynik?

Dzięki.

+0

Doskonałe pytanie BTW. Ta myśl jeszcze nie przyszła mi do głowy. (Nadal ucząc się Haskella) –

Odpowiedz

66

Porównując list z == wymaga elementy być porównywalne (oznaczone jako Eq a). Na przykład [sin] == [] nie będzie działać, ponieważ nie można porównywać funkcji. Może wydawać się to głupie, ale system typów musi oceniać typ wyrażenia, nie patrząc na jego wartość.

Alternatywna kontrola to length xs == 0, to nie wymaga równości, ale nie kończy się, jeśli lista jest nieskończona (spróbuj length [1..] == 0). Dlatego istnieje dedykowana funkcja.

null [] = True 
null _ = False 

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

Moim zdaniem, null myList czyta bardziej naturalnie niż myList == [].

Jednak racji stanu dla null jest to, że może być używany jako funkcja. Na przykład, tutaj jest to funkcja, która pobiera listę list i zwraca tylko niepuste te:

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

Bez null, to byłoby bardziej niewygodne:

nonEmptyLists = filter ([] /=) 
+4

Jednak "filter ([]/=)". – kennytm

+0

W jaki sposób odwrócić operandy i jest gotowa jeszcze bardziej naturalnie: 'filter (/ = [])'. Zauważ, że zawsze wolałbym porównywanie wzorców z operatorem równości (chyba że w powyższym przypadku używałbym go jako funkcji). – Dario

+13

Zobacz odpowiedź sdcvvc: Prawdziwym powodem jest to, że 'null' działa z jakąkolwiek listą, podczas gdy' (== [ ]) 'działa tylko z listami' Eq'. –

6

Inną korzyścią wynikającą ze stosowania null jest wiele pojemników (np Data.Sequence, Data.ByteString, itd.) Mają null tutaj skuteczne. Ułatwia to przejście do innej implementacji po prostu przez zmianę swoich instrukcji importowania.

Powiązane problemy