2016-06-20 11 views
8

Patrząc na poniższy kod:Czy często używa się tej samej nazwy dla typu danych i konstruktora wartości w Haskell?

data Point = Point Float Float deriving (Show) 
data Shape = Circle Point Float | Rectangle Point Point deriving (Show) 

który jest z książki Dowiedz ci Haskell za wielkie dobro, które towarzyszy tej przykład kodu z następującym tekstem:

Zauważ, że przy określaniu punktu użyliśmy tej samej nazwy dla typu danych i konstruktora wartości. Nie ma to specjalnego znaczenia, chociaż często używa się tej samej nazwy co typ, jeśli istnieje tylko jeden konstruktor wartości.

Teraz moje założenie, że data Point = ... jest typem danych, a ... = Point Float... jest konstruktor wartość.

Moje pytanie brzmi: Czy często używa się tej samej nazwy dla typu danych i konstruktora wartości w Haskell?

+2

Tak, jest. Jednak zazwyczaj używamy 'newtype' zamiast' data'. Na przykład "Stan" jest zwykle definiowany w następujący sposób: 'stan nowego stanu s a = Stan {runState :: s -> (a, s)}'. –

+2

@AaditMShah Działa to tylko dla pojedynczych konstruktorów pól. Chyba że za każdym razem chcesz rozpakować krotkę, nie możesz użyć 'newtype' dla wspomnianego' Point'. – Zeta

+1

Kiedyś wyjaśniałem Haskell komuś, że w niektórych językach (np. Java) konstruktor * zawsze * ma taką samą nazwę jak typ. Tak więc dla kogoś, kto przyjeżdża do Haskell, może być mylące mieć różne nazwy konstruktorów. – user2297560

Odpowiedz

9

Z mojego ograniczonego doświadczenia: Tak. Ma to również sens. Dlaczego miałbyś inaczej dzwonić pod Point? To doskonale opisuje typ danych, a także jest jasne używać do dopasowywania wzorców jak to

myFunc :: Point -> Bool 
myFunc (Point 0 0) = True 
myFunc _ = False 

Jest to jednoznaczne, ponieważ można umieścić tylko typ danych w podpisie typu funkcji.

+2

To ma wiele sensu. Jedyną wadą jest to, że początkującym uczącym się języka początkowo jest to nieco mylące - trudno jest zrozumieć, że "Punkt" reprezentuje dwie różne rzeczy w różnych kontekstach. Nie powinno to mieć wpływu na to, jak piszesz kod w swoich projektach lub w pracy, ale jeśli kiedykolwiek będziesz potrzebował zaprojektować program wprowadzający w Haskell, należy o tym pamiętać. –

Powiązane problemy