2012-01-11 14 views
18

To wydaje się być prawny:Dlaczego typy bez konstruktorów danych są poprawne?

data MagazineInfo = Int String 
    deriving (Show) 

Nie jestem pewien, czy nie jest konstruktorem domyślnym danych, ale powyższy kod kompiluje.

Dlaczego powyższy prawidłowy Haskell, ponieważ nie określiłem jawnie konstruktora wartości?

+0

Jeśli próbowałbyś użyć tego typu danych pisząc selektor, zauważyłbyś, że nie ma "Int", z którego mógłbyś wyjść ... – ShiDoiSi

Odpowiedz

29

Masz tam konstruktora danych - to Int. Nazwy typów są żywe w oddzielnym obszarze nazw od konstruktorów danych, dlatego też nie występuje błąd, mimo że istnieje typ o nazwie Int.

+5

I często nazwa konstruktora danych jest taka sama jak typ imię w takich przypadkach, gdzie jest tylko jeden zwycięzca. 'data MagazineInfo = MagazineInfo String' –

+8

Istnieje również coś takiego jak [puste typy] (http://www.haskell.org/haskellwiki/Empty_type) - ale w rzeczywistości przykład plakatu nie jest taki. Typy puste są używane w połączeniu z niektórymi zaawansowanymi technikami systemowymi. –

+4

Oczywiście, dla pojedynczego konstruktora, przypadki pojedynczych elementów, preferowany jest 'nowytyp' nad' danymi'. –

Powiązane problemy