2016-12-05 17 views
7

W moim postrzeganiu początkujący, można wdrożyć Data.List.null jak:Dlaczego "Data.List.null" używa "foldr"?

null [] = True 
null _ = False 

Patrząc rzeczywiste źródło w Hackage widzę:

null = foldr (\_ _ -> False) True 

znajdę to na pewno ciekawy, mam coś, czego brakuje powinien się dowiedzieć, ale co?

Odpowiedz

14

null to metoda klasy Foldable:

GHCi> :t null 
null :: Foldable t => t a -> Bool 

Realizacja cytujesz jest the default one, przeznaczona do pracy dla wszystkich wystąpień Foldable nawet jeśli nie określają konkretnej realizacji:

class Foldable t where 
    -- etc. 
    null :: t a -> Bool 
    null = foldr (\_ _ -> False) True 
    -- etc. 

Jednak list instance, zastępuje domyślną implementację:

instance Foldable [] where 
    -- etc. 
    null = List.null 
    -- etc. 

List.null kolei is defined in GHC.List w prostszy sposób, że oczekiwany:

null     :: [a] -> Bool 
null []     = True 
null (_:_)    = False 
+2

jakiekolwiek powody '(_: _)' zamiast po prostu '_'? Aby wymusić błąd na "niezdefiniowanym" lub coś podobnego? – Xeo

+0

@duplode cudownie, dziękuję, dostaję za rutynowe pomijanie deklaracji klasowych i podpisów typu =) – metaleap

+1

@Xeo Dobre pytanie. Nie wiem, czy istnieje głębszy powód poza spójnością stylu w tym module. Wymuszenie błędu na "niezdefiniowanym" nie jest konieczne - biorąc pod uwagę, że '[]' jest dopasowywane jako pierwsze, 'null undefined' i tak zostanie wysadzone. – duplode

Powiązane problemy